python2.6.5中的相对导入

时间:2011-07-27 13:11:07

标签: python

相对导入在python2.6.5中无法正常工作获取“ValueError:在非包中尝试相对导入”。

我将所有__init__.py放在适当的位置。

2 个答案:

答案 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复制(安装)到目标系统的脚本文件夹。

感谢https://stackoverflow.com/a/1083169