Как добавить еще один проект Python в мой проект в качестве подмодели?

Я скопировал проект 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Просто добавьте пустой файл Python с именем __init__.py в свой проект B, чтобы Python рассматривал этот проект как обычный модуль Python.

Нет, это не работает. Я боюсь пути импорта.

Snoopy 22.12.2020 12:12

Попробуйте это from B import test32

Walid 22.12.2020 12:15

сначала сделайте модуль, используя __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, а не искать в том же каталоге.

Другие вопросы по теме