Я скопировал проект Python B в свой проект A в качестве модели. Но путь включения B основан только на B. Итак, как я могу вызвать функцию B из A. Например,
.
└── mypackage A
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage B
├── test31.py
└── test32.py
test31.py может включать test32.py
import test32
Но с точки зрения А, я должен включить его в
import B.test32
На самом деле, B сложнее, чем этот пример. Как я могу реорганизовать его?
Просто добавьте пустой файл Python с именем __init__.py
в свой проект B, чтобы Python рассматривал этот проект как обычный модуль Python.
Попробуйте это from B import test32
сначала сделайте модуль, используя __init__.py
в B
тогда попробуйте это:
from B.test32 import 'function Name'
а потом назови.
Как сказал @Wàlid Bachri, вы должны начать размещать __init__.py
файлы, но это немного сложнее, чем.
Вы должны поместить эти __init__.py
файлы в каждый каталог. Так что это будет выглядеть примерно так.
.
└── mypackage A
├── __init__.py # here under A
├── subpackage_1
| ├── __init__.py
│ ├── test11.py
│ └── test12.py
├── subpackage_2
| ├── __init__.py # under package 2
│ ├── test21.py
│ └── test22.py
└── subpackage B
├── __init__.py # under package B
├── test31.py
└── test32.py
В каждом из файлов __init__.py
вам необходимо импортировать все файлы в одном каталоге. Так, например, в subpackage B
вам нужно сделать это.
#/subpackage B/__init__.py
from . import test31
from . import test32
в mypackage A
, где нет файлов, только каталоги, вы тоже делаете то же самое (from . import subpackage_2
и т.д.).
Если я предполагаю, что mypackage A
является «основным» пакетом (как видно из вашей диаграммы), то есть это не подмодуль, для запуска любого файла вам нужно будет выполнить следующее.
Сначала cd
в родительский каталог mypackage A
, а затем
# Suppose you want to execute /subpackage_1/test11
python -m mypackage_A.subpackage_1.test11 # WARNING mypackage A should have no whitespace
Вы можете получить RuntimeWarning
о том, что ваш sys.modules
был изменен, но я могу заверить вас по опыту, что вы можете спокойно его игнорировать. Вот как обычно делаются модули Python для pip, чтобы обеспечить простоту запуска в производство.
Обновлено: Также обратите внимание, что во всех ваших файлах вы должны переключиться на импорт пакетов для относительного импорта, поэтому вы должны использовать точечный синтаксис.
from . import test32 # this will import .test32
если бы вы вместо этого использовали import test32
из test31
, интерпретатор попытался бы найти глобальный пакет с именем test32
, а не искать в том же каталоге.
Нет, это не работает. Я боюсь пути импорта.