gpt4 book ai didi

python - 通过 importlib 以编程方式导入模块 - __path__ 未设置?

转载 作者:太空狗 更新时间:2023-10-29 21:18:36 24 4
gpt4 key购买 nike

我正在尝试以编程方式导入子模块。我的文件树如下所示:

oopsd/__init__.py
oopsd/oopsd.py
oopsd/driver/__init__.py
oopsd/driver/optiups.py

optiups.py 只是打印“Hello World”。

oopsd.py 看起来像这样:

import importlib
importlib.import_module('oopsd.driver.optiups')

现在有了这个,我得到了这个异常(exception):

Traceback (most recent call last):
File "<frozen importlib._bootstrap>", line 1521, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "oopsd/oopsd.py", line 29, in <module>
sys.exit(main())
File "oopsd/oopsd.py", line 23, in main
loaddriver()
File "oopsd/oopsd.py", line 26, in loaddriver
importlib.import_module('oopsd.driver.optiups')
File "/usr/lib/python3.3/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
File "<frozen importlib._bootstrap>", line 1514, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
File "<frozen importlib._bootstrap>", line 1524, in _find_and_load_unlocked
ImportError: No module named 'oopsd.driver'; oopsd is not a package

__path__ 是否仍然存在于 Python 3 中?

我也尝试导入 .driver.optiups,但这会产生:

TypeError: relative imports require the 'package' argument

__package__ 似乎没有设置,所以我迷路了。

如何以正确的方式执行此操作?

最佳答案

这是一个老问题,但是因为被撞了,其他答案完全错误,这是一个常见问题:

您可能正在这样做。

python oopsd/oopsd.py

不要这样做。 :)

具体来说,永远不要尝试直接运行属于父包的文件。当你运行 python FILENAME , Python 将文件的包含目录 添加到sys.path , 并且不添加当前目录。所以你有 oopsd/在你的路径中,以及 oopsd/ 中的每个模块刚刚成为顶级模块。 Python 甚至无法知道它们中的任何一个应该有一个 oopsd.。前缀,因为父目录在 sys.path 中不存在.

如果你想直接执行一个模块,这样做:

python -m oopsd.oopsd

这会将当前目录放入sys.path并确保您的源代码树的导入工作如您所期望的那样。

Alex Z 的回答是错误的,因为它实际上并没有解决这个问题,而且它不是相对导入 — Python 3 中不再存在隐式相对导入。

关于python - 通过 importlib 以编程方式导入模块 - __path__ 未设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com