Я понял. Очень неприятно, особенно если исходить из python2.
Вы должны добавить .
к модулю, независимо от того, является он относительным или абсолютным.
Я создал настройку каталога следующим образом.
/main.py
--/lib
--/__init__.py
--/mody.py
--/modx.py
modx.py
def does_something():
return "I gave you this string."
mody.py
from modx import does_something
def loaded():
string = does_something()
print(string)
main.py
from lib import mody
mody.loaded()
когда я выполняю main, вот что происходит
$ python main.py
Traceback (most recent call last):
File "main.py", line 2, in <module>
from lib import mody
File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
from modx import does_something
ImportError: No module named 'modx'
Я запустил 2to3, и основной результат был таким
RefactoringTool: Refactored lib/mody.py
--- lib/mody.py (original)
+++ lib/mody.py (refactored)
@@ -1,4 +1,4 @@
-from modx import does_something
+from .modx import does_something
def loaded():
string = does_something()
RefactoringTool: Files that need to be modified:
RefactoringTool: lib/modx.py
RefactoringTool: lib/mody.py
Мне пришлось изменить оператор импорта mody.py, чтобы исправить это
try:
from modx import does_something
except ImportError:
from .modx import does_something
def loaded():
string = does_something()
print(string)
Затем я снова запустил main.py и получил ожидаемый результат
$ python main.py
I gave you this string.
Наконец, просто чтобы очистить его и сделать переносным между 2 и 3 годами.
from __future__ import absolute_import
from .modx import does_something
07.08.2017
sys.path.append('/some/path/my_module')
внутри/some/path/my_module/__init__.py
? 07.12.2017sys.path
во время выполнения (github.com/). Вы также можете установить переменную среды PYTHONPATH. 08.12.2017__init__.py
файлы больше не нужны. Интересно. Вы можете остановиться на этом? У меня создалось впечатление, что механизм разрешения пакетов не сильно изменился между 2 и 3. 07.05.2019__init__.py
файлы. И наоборот, можете ли вы описать вещи, если мы хотим, чтобы пакет работал и в 2, и в 3? И посмотрите ужасно устаревший для чего__init__.py
? от 2009 года и его ответ, получивший наибольшее количество голосов Это часть пакета. Нам нужно начать подчеркивать различие обычный пакет [старый, до 3.3] и namespace package [3.3+] везде и часто. 08.05.2019