Python modulefinder не работает с файлом в другом каталоге, если он не запущен в среде REPL - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть каталог с такой структурой:

main/
    find.py
    project/
        hello.py
        module_a.py

hello.py имеет следующее:

import module_a
print('hello')

Я пытаюсь использовать стандартную библиотеку ModuleFinder чтобы обнаружить module_a импорт.Я могу сделать это в интерпретаторе (начиная с main):

$ python3
Python 3.7.1 (default, Nov 17 2018, 18:28:26)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> from modulefinder import ModuleFinder
>>> os.chdir('project')
>>> f = ModuleFinder()
>>> f.load_file('hello.py')
>>> print(f.modules)
{'hello': Module('hello', 'hello.py'), 'module_a': Module('module_a', 'module_a/__init__.py', ['module_a'])}

My find.py делает то же самое:

import os
from modulefinder import ModuleFinder

os.chdir('project')
f = ModuleFinder()
f.load_file('hello.py')
print(f.modules)

Однако, когда язапустить его, используя python3 find.py из каталога main, он не обнаружит module_a:

$ python3 find.py
{'hello': Module('hello', 'hello.py')}

Я могу получить скрипт find.py для обнаружения модуля, когда я помещаю его втот же каталог, что и hello.py, но это мне не полезно.Я ожидаю, что os.chdir('project') приведет к тому, что скрипт будет вести себя так же, как если бы я поместил его в тот же каталог, но должно быть какое-то другое различие, о котором я не знаю.

1 Ответ

0 голосов
/ 20 ноября 2018

Я смог загрузить импорт модуля, передав необязательный аргумент path в конструктор ModuleFinder.

import sys
import os
from modulefinder import ModuleFinder

script = 'project/hello.py'
path = sys.path[:]
path[0] = os.path.dirname(script)
f = ModuleFinder(path)
f.load_file(script)
print(f.modules)

Выводы:

{'hello': Module('hello', 'project/hello.py'), 'module_a': Module('module_a', 'project/module_a/__init__.py', ['project/module_a'])}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...