Python 从包外脚本导入

Python import from script outside package

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 时效果很好,没有导入错误并按预期打印出 "something"。

但是当我调用 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 . . .

您需要更改导入:

from file import whatever

收件人:

from .file import whatever

由于您的 运行 代码在文件夹之外,因此使用 . 获取目录,因为文件不在包之外。