У меня есть код Python в папке с именем "project", поэтому мои файлы кода находятся в проекте / *. Py.Я хочу иметь подмодули внутри него, например,
project/code.py # where code lives
project/mymodule1 # where more code lives
project/mymodule2
каждый каталог модуля имеет свой собственный файл init .py, например,
project/mymodule1/__init__.py
предположим, у меня есть файл«test.py» в mymodule1 (project / mymodule1 / test.py), и я хотел бы сослаться на что-то из «code», например, импортировать функцию «myfunc»
== project/mymodule1/test.py ==
from code import myfunc
, проблема в том, что«Код» не будет найден, если пользователь не поместит каталог «project /» в свою PYTHONPATH.Есть ли способ избежать этого и использовать какой-то «относительный путь» для импорта myfunc, например,
from ../code import myfunc
в основном, я не хочу заставлять пользователей кода изменять PYTHONPATH, если я не могусделать это программно для них из моего сценария.Я хотел бы, чтобы это работало из коробки.
Как это можно сделать?Любое решение является хорошим: изменение PYTHONPATH программно или, что более важно, обращение к «коду» с использованием некоторого относительного импорта, поскольку, хотя я не знаю, где «project / code.py» живет на компьютере пользователя, я знаю, гдеэто относительно "myfunc".
РЕДАКТИРОВАТЬ: Может кто-нибудь показать правильный пример импорта внутри пакета?Я попытался из "mymodule1" сделать:
from .. import foo
, где "foo" находится в code.py, но он не работает.У меня есть init .py в mymodule1, поэтому:
project/code.py
project/mymodule1/__init__.py
project/mymodule1/module1_code.py
, где module1_code.py пытается импортировать foo, функцию, определенную в "code.py".
РЕДАКТИРОВАТЬ: Основная путаница у меня все еще есть, что даже после принятия примера, приведенного в ответ на мое сообщение, показывая иерархию проекта / sub1 / test, вы все равно не можете "cd" в sub1 и сделать "python test.py" и иметь егоРабота.Пользователь должен находиться в каталоге, содержащем «project», и выполнить «import project.sub1.test».Я бы хотел, чтобы это работало независимо от того, в каком каталоге находится пользователь. В этом случае пользователь должен выполнить файл "test.py", который находится в проекте / sub1 /.Итак, контрольный пример:
$ cd project/sub1
$ python test.py
, что приводит к ошибке:
ValueError: Attempted relative import in non-package
как это можно исправить?
спасибо.