Импорт файлов работает, когда я запускаю файл изнутри модуля, но не когда я запускаю файл, импортируя модуль извне - PullRequest
0 голосов
/ 21 января 2019

Моя структура каталогов:

test.py
module/
    importer.py
    importee.py
    __init__.py

Итак, в моем каталоге у меня есть test.py, затем другой каталог, который был инициализирован как модуль. В этом модуле есть файл importer.py, который импортирует файл importee.py. Чтобы проверить, работает ли импорт, я сделал простую функцию в importee.py и попытался использовать ее в importer.py (т.е. я запустил importer.py напрямую); это работало просто отлично.

Но когда я захожу в test.py и получаю оператор импорта from module import * и пытаюсь запустить его (без какого-либо другого кода), выдается ошибка, которая прослеживается до оператора импорта в importer.py, говоря: No module named 'importee'

Если это имеет значение, __init__.py в каталоге module имеет правильно заданную функцию __all__.

Мне нравится думать, что это не дубликат, несмотря на наличие постов с таким же названием, таких как this или this или this или this ; Я искал часы и до сих пор не знаю, что может быть причиной этого.

Есть идеи? Любая помощь с благодарностью.

Редактировать: содержимое четырех файлов:

init.py

__ all __ = ["importee", "importer"]

importee.py

def example():
    print("hey")

importer.py

from importee import * 
example()

test.py

from module import * 

Когда я запускаю importer.py, я не получаю ошибок, но когда я запускаю test.py, я получаю ошибку, которая прослеживается до первой строки importer.py, говоря, что No module named 'importee' found, даже если я этого не получаю ошибка при прямом запуске importer.py ...

1 Ответ

0 голосов
/ 21 января 2019

Следующая команда запускает и печатает «эй» независимо от того, запускаете ли вы python test.py от пользователя root или python importer.py от module.

Вы можете узнать больше об относительном импорте из PEP 328. Вы можете узнать больше об init здесь , но важно отметить, что __init__ запускается, когдавы импортируете из module.

Кроме того, определение __all__ переопределяет идентификаторы, которые начинаются с _, и, поскольку вы их не используете, на самом деле я не знаю, будет ли это иметь какой-либо эффект.

# test.py
from module import *

# module/__init__.py
from .importer import * 

# module/importee.py
def example():
    print("hey")

# module/importer.py
from .importee import *

example()
...