我有一个大的仓库,有一些固定的结构,我通过一些文件夹和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
现在我可以看到,当python从 toplevelfolder
作为 ..
将代表后者的父目录,而不是代表父目录的 featureA
. 然而,我无法掌握第一条错误信息,特别是因为 toplevelfolder
不应该是一个模块,而应该是一个包。
有没有其他方法可以在Python中导入我不知道的东西,如果可能的话,不用修改PYTHONPATH或sys.path之类的东西?
我不是100%确定这里的目标是什么。我的建议是
清楚地确定你想让你的顶层模块和包是什么。
让所有的导入都是绝对的。
或者
site-packages
目录。确保通过 可执行模块 方法,而不是 脚本 办法
path/to/pythonX.Y -m toplevelpackage.module
DOpath/to/pythonX.Y toplevelpackage/module.py
不要path/to/pythonX.Y -m toplevelmodule
DOpath/to/pythonX.Y toplevelmodule.py
不要path/to/pythonX.Y -m toplevelpackage.subpackage
DO(假设有 toplevelpackage/subpackage/__main__.py
文件)。)稍后,一旦一切顺利,一切都在控制之中,你可能会决定将部分或全部导入改为相对导入。(如果事情做得很好,我相信有可能使它可以从目录结构中的任何级别调用可执行模块作为当前工作目录。)
参考文献。
python -m package.module
而不是。https:/mail.python.orgpipermailpython-30002007-April006793.html。 -- https:/www.python.orgdevpepspep-3122试试把这个粘贴到你的导入上面。
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
然后你就可以从父文件夹中导入一个文件。