Импорт Python из скрипта вне пакета - PullRequest
2 голосов
/ 07 мая 2019

Python не может импортировать пакет, но работает правильно изнутри пакета.Полнофункциональный пример ниже.В виртуальной среде я использую 3.6 Все ответы очень ценятся!

parsers/
    __init__.py
    element.py
    parser1.py
    parser2.py
    parserresolver.py
outsidepkg.py

init .py пуст

element.py:

def router():
    pass

parser1.py:

from element import *
def parse(data):
    return data

parser2.py:

from element import *
def parse(data):
    return data

parserresolver.py:

import sys
from parser1 import *
from parser2 import *

def resolve(data):
    parseddata = None
    parsers = ['parser1', 'parser2'] 
    funcname = 'parse'
    for parser in parsers:
        module = sys.modules[parser]
        if hasattr(module, funcname):
            func = getattr(module, funcname)
            parseddata = func(data)
            print(parseddata)
            return parseddata

if __name__ == "__main__":
    resolve('something')

outsidepkg.py:

import parsers.parserresolver
def getapi(data):
    parsers.parserresolver.resolve(data)
if __name__ == "__main__":
    print(getapi('in parse api main'))

Так что, когда я вызываю parserresolver.py напрямую, он прекрасно работает, никаких ошибок импорта и не выводит «что-то», как ожидалось.

Но когда я вызываю outsidepkg.py, я получаю эту ошибку:

Traceback (most recent call last):
  File "C:\code\TestImport\TestImport\outsidepkg.py", line 1, in <module>
    import parsers.parserresolver
  File "C:\code\TestImport\TestImport\parsers\parserresolver.py", line 2, in <module>
    from parser1 import *
ModuleNotFoundError: No module named 'parser1'
Press any key to continue . . .

1 Ответ

2 голосов
/ 07 мая 2019

Вам необходимо изменить импорт:

from file import whatever

Кому:

from .file import whatever

Поскольку ваш код для запуска находится вне папки, используйте ., чтобы получить каталог, поскольку файл не находится за пределами пакета.

...