我有一个具有固定结构的大型存储库,并通过一些文件夹和python脚本对其进行了扩展,从而为其整体添加了额外的功能。结构如下:
现在someModuleA.py
和someModuleB.py
可以通过app.py
调用,但同时也可以直接调用,但是此调用必须来自toplevelfolder,以便正确解析文件中的相对路径,即通过python ./featureA/someModuleA.py
这一切都很好,但是现在我需要一些来自someModuleB
中someModuleA
的函数定义,因此我想导入这个模块。我尝试过绝对导入和相对导入,但都失败了,错误不同,绝对导入有错误
from toplevelfolder.featureA import someModuleA as A
# ModuleNotFoundError: No module named 'toplevelfolder'
以及与
from toplevelfolder.featureA import someModuleA as A
# ImportError: attempted relative import with no known parent package
现在我可以看到,当从toplevelfolder
调用python时,相对导入将导致问题,因为..
将表示后者的父目录,而不是featureA
的父目录。但是,我无法获得第一条错误消息,特别是因为toplevelfolder
不应该是一个模块,而应该是一个包
如果可能的话,在不修改PYTHONPATH或sys.path或类似的东西的情况下,有没有其他我不知道的导入Python的方法
不是100%确定这里的目标是什么。我的建议是:
清楚地确定您希望顶级模块和软件包是什么
使所有进口成为绝对进口
要么:
site-packages
目录中李>如果要执行的“入口点”是包的一部分,请确保通过可执行模块或包方法而不是脚本方法调用代码
path/to/pythonX.Y -m toplevelpackage.module
path/to/pythonX.Y -m toplevelpackage.subpackage
(假设有一个toplevelpackage/subpackage/__main__.py
文件)path/to/pythonX.Y toplevelpackage/module.py
(可选)稍后,一旦一切正常,一切都在控制之下,您可能会决定将部分或全部导入更改为相对导入。(如果事情做对了,我相信这是可能的,这样就可以从目录结构中的任何级别调用可执行模块作为当前工作目录。)
参考文献:
python -m package.module
代替:https://mail.python.org/pipermail/python-3000/2007-April/006793.html{a2}尝试将其粘贴到导入上方:
然后您应该能够从父文件夹导入文件
不要包含顶级目录。在功能B.someModuleB中:
Sample directory.
相关问题 更多 >
编程相关推荐