不管尝试什么, 因为我切换到Python 3, 所以只能从项目的根文件夹运行导入脚本,而不能从子文件夹运行脚本。我知道关于我收到的错误消息,这里有很多问题,但是建议的解决方案对我不起作用。有人可以为这个小样本项目提供样本解决方案吗?我相信许多人都会感激。
proj
├── foofolder
│ ├── __init__.py
│ └── foofile.py
├── subfolder
│ ├── __init__.py
│ └── run.py
└── __init__.py
我定义函数foofun()
中foofile.py
,并希望将其调用run.py
。
如果run.py
直接在proj
它的作品。但是(为了使事情井井有条),我想将其放在子文件夹中-令人惊讶的是,这似乎是不可能的。
令人讨厌的是,我的IDE(PyCharm)中的自动完成功能建议该方法from foofolder.foofile import foofun
可以正常工作。但事实并非如此。我也无法想象其他任何导入:
from foofolder.foofile import foofun
-> ImportError: No module named 'foofolder'
from .foofolder.foofile import foofun
-> SystemError: Parent module '' not loaded, cannot perform relative import
(与开头两个点相同。)
from proj.foofolder.foofile import foofun
-> ImportError: No module named 'proj'
甚至没有绝对的进口作品。为什么找不到proj
?
sys.path
是: ['/parent/proj/subfolder', '/parent/env/lib/python35.zip', '/parent/env/lib/python3.5', '/parent/env/lib/python3.5/plat-x86_64-linux-gnu', '/parent/env/lib/python3.5/lib-dynload', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/parent/env/lib/python3.5/site-packages']
我在virtualenv中使用Python 3.5.2。
编辑:当我建议此问题特定于Python 3时,我错了。当我在Python 2.7.12中签入时,问题和解决方案相同。
Pevogam提供的解决方案有效。第一个字面上仅添加'..'
到'sys.path'
,它描述了run.py
执行位置的父文件夹。第二个显式添加'/parent/proj'
。
我可以想到的最快方法是:
# subfolder/run.py
import sys
sys.path.append("..")
from foofolder.foofile import foofun
foofun()
但是请注意,这仅在您从其文件夹中运行run.py时才有效。不依赖于此的更复杂的方法是
# subfolder/run.py
import sys
import os.path as o
sys.path.append(o.abspath(o.join(o.dirname(sys.modules[__name__].__file__), "..")))
from foofolder.foofile import foofun
foofun()
您可以从任何位置访问该功能的地方。对于所有此类模块,最简单的操作是使用指向根包的相同指针,在您的情况下,可以通过添加“ ..”来实现。然后,您可以从此根软件包的角度执行任何导入。
我倾向于避免使用相对导入,因为它们会造成混乱并降低可读性,但希望其中一些有所帮助。
[*]某些IDE可能会执行自己的项目扫描,这就是只要您在IDE中运行python代码,它们仍可能找到导入的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句