Как мне запустить основной скрипт пакета Python напрямую? - PullRequest
1 голос
/ 29 сентября 2019

У меня проблема с большим набором скриптов, которые я поместил в пакет, и настроил тестовое репо package_test, чтобы все заработало, как показано ниже. Я использую Python 3.7.4 в Windows 10 с VS Code в качестве моей IDE.

package_test/
-- package_test/
---- __init__.py
---- __main__.py
---- package_test.py
---- module_1.py
-- setup.py

Я получил работу для того, чтобы я мог запустить это как модуль, используя python -m package_test изкорень этого каталога. Однако, если я пытаюсь запустить модуль package_test.py напрямую (например, запустить VS Code или использовать отладчик), я получаю сообщение об ошибке.

Похоже, проблема связана с импортом. Почему я не могу запустить скрипт package_test.py напрямую?


Вот соответствующие файлы:

__ init __. Py

from .module1 import *

__ main __. Py

import package_test.package_test

def main():
    package_test.package_test.main()

if __name__ == '__main__':
    main()

package_test.py

import package_test
from package_test.module1 import *

def main():
    package_test.module1.main()

if __name__ == '__main__':
    main()

module1.py

import package_test
from .module1 import *

def textfx():
    print('Hello textfx!!')

def main():
    package_test.module1.textfx()

if __name__ == '__main__':
    main()

Ошибка при прямом запуске:

USER@PC MINGW64 /c/Code/python/package_test (master)
$ C:/apps/Python37/python.exe c:/Code/python/package_test/package_test/package_test.py
Traceback (most recent call last):
  File "c:/Code/python/package_test/package_test/package_test.py", line 1, in <module>
    import package_test
  File "c:\Code\python\package_test\package_test\package_test.py", line 2, in <module>
    from package_test.module1 import *
ModuleNotFoundError: No module named 'package_test.module1'; 'package_test' is not a package

Но, когда я запускаю это как модуль, результат:

USER@PC MINGW64 /c/Code/python/package_test (master)
$ py -m package_test
Hello textfx!!

1 Ответ

1 голос
/ 29 сентября 2019

Как видно из документации sys.path:

Как инициализируется при запуске программы, первый элемент этого списка, path[0], является каталогомсодержащий скрипт, который использовался для вызова интерпретатора Python. [...]

Поскольку вы работаете с package_test$ python package_test/package_test.py, первое место, где Python будет искать модули в вашем примере, это package_test/package_test. Здесь он находит модуль package_test.py, который вы импортируете через import package_test. Теперь этот модуль кэшируется в sys.modules. Когда вы делаете from package_test.module1 import *, он выбирает package_test из кэша модуля и сообщает, что это не пакет, и поэтому не может выполнить импорт.

Вам следует переименовать этот сценарий package_test.py вчто-то другое. Почему он существует в первую очередь, когда все, что он делает, это импорт из другого модуля и __main__ просто импорт из этого скрипта. Почему вы не можете запустить __main__.py и импортировать его из module1 напрямую?

Вы можете поместить этот код вверху package_test.py и проверить вывод:

import sys
print(sys.path)

import package_test
print(sys.modules)
print(package_test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...