相对导入在python2.6.5中无法正常工作获取“ValueError:在非包中尝试相对导入”。
我将所有__init__.py
放在适当的位置。
答案 0 :(得分:2)
在运行实际上 in 包中的脚本之前,我已经看到了这个错误。对于解释器来说,好像包不是包。
尝试将脚本放入另一个目录,将您的包放在pythonpath
内,然后绝对导入。然后,您的包内的相对导入将起作用。注意:您仍然可以在结束脚本中不进行相对导入 - 在这种情况下最简单的方法是创建一个“包装”脚本,只需调用包中的某个入口点。
您可以使用setuptools
为您的包创建setup.py
,以使其可分发,从而更进一步。然后,作为其中的一部分,entry points将允许您自动生成调用包的代码的脚本。
修改强>:
从你的评论来看,似乎我不是很清楚。我不是100%肯定你的目录结构,因为上面的评论没有格式化,但我认为它是这样的:
PythonEvent/
main.py
__init__.py
DBConnector/
__init__.py
connector.py
service/
__init__.py
myservice.py
当您在myservice.py
中有from ..DBConnector.connector import DBUpdate
行时,解释程序会尝试相对导入它,除非您直接运行myservice.py
。这就是你正在做的事情。
尝试在PythonEvent/
之外创建另一个虚拟脚本,如下所示:
from PythonEvent.service import myservice
if __name__ == '__main__':
myservice.main() # or whatever the entry point is called in myservice.
然后,将PYTHONPATH
环境变量设置为指向PythonEvent/
的父目录(或将PythonEvent/
移至您的网站包)。
答案 1 :(得分:0)
main.py
setup.py
Main Package/ ->
__init__.py
subpackage_a/ ->
__init__.py
module_a.py
subpackage_b/ ->
__init__.py
module_b.py
i)
1.You run python main.py
2.main.py does: import app.package_a.module_a
3.module_a.py does import app.package_b.module_b
ⅱ)
Alternatively 2 or 3 could use: from app.package_a import module_a
只要你的PYTHONPATH中有app,那就行了。 main.py可以在任何地方。
因此,您编写了一个setup.py来将整个应用程序包和子包复制(安装)到目标系统的python文件夹,并将main.py复制(安装)到目标系统的脚本文件夹。