Python从包外脚本导入

标签 python python-3.x python-import

Python 无法导入包,但可以在包内正常工作。下面是一个功能齐全的示例。在虚拟环境中,我使用的是 3.6 非常感谢所有回复!

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

init.py 为空

元素.py:

def router():
    pass

解析器1.py:

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

解析器2.py:

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

解析器解析器.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')

外部pkg.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 . . .

最佳答案

您需要更改以下内容的导入:

from file import whatever

致:

from .file import whatever

由于运行它的代码位于文件夹外部,因此请使用 . 获取目录,因为该文件不在包外部。

关于Python从包外脚本导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014933/

相关文章:

python - 如何使用 Mechanize 填写表格?

python - 漂亮的 Python 装饰器

python - 使用 asyncio 的多个循环

python - 我应该如何在 python 模块中执行导入而不污染其命名空间?

python - 错误 : "Cannot find reference to loads in json.py"

python - 如何将我的 Pandas 数据分组概括到3个以上的维度?

python - 使用 python Selenium 获取动态生成的内容

python - 如何为多个Python版本和平台构建编译模块

Python 导入模块与导入_模块

python - 使用 numpy.loadtxt 加载复数