如果将脚本移动到子目录,Python脚本导入将失败

时间:2010-11-20 14:57:44

标签: python virtualenv

这可能是我自己对Python导入和搜索路径如何工作的误解,或者在caldav包的打包中可能存在问题。

我已经建立了一个名为myproject

的virtualenv环境

在myproject的顶层,我有一个脚本test.py,其中包含两个导入:

import lxml
import caldav

在此目录中,我输入:

python test.py

并且没有任何问题,它可以正常工作

现在我将脚本移动到子目录测试并运行命令:

python test/test.py

导入lxml似乎仍然有用。导入的caldav失败,出现以下异常:

Traceback (most recent call last):
  File "test/test.py", line 34, in <module>
    main()
  File "test/test.py", line 29, in main
    exec ( "import " + modulename )
  File "<string>", line 1, in <module>
  File "/home/ec2-user/caldav2sql/myproject/test/caldav/__init__.py", line 3, in <module>
    from davclient import DAVClient
  File "/home/ec2-user/caldav2sql/myproject/test/caldav/davclient.py", line 8, in <module>
    from caldav.lib import error
ImportError: No module named lib

我在这里做错了吗?我应该建立某种道路吗?

1 个答案:

答案 0 :(得分:3)

最有可能的是,caldavtest.py位于同一目录中,因此当您import时,它工作正常。现在您已将test.py移至子目录,导入无法找到它。您可以移动caldav或设置PYTHONPATH

您还可以修改sys.path

来自Python模块教程的信息:http://docs.python.org/tutorial/modules.html

  

变量sys.path是一个字符串列表,用于确定解释器的模块搜索路径。它被初始化为从环境变量PYTHONPATH获取的默认路径,或者如果未设置PYTHONPATH,则从内置默认路径初始化。您可以使用标准列表操作对其进行修改:

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')