Python脚本移动到子目录后导入失败

2 投票
1 回答
1218 浏览
提问于 2025-04-16 07:23

这可能是我对Python导入和搜索路径的理解有误,或者可能是caldav这个包的打包出现了问题。

我已经设置了一个名为myproject的虚拟环境。

在myproject的顶层,我有一个名为test.py的脚本,里面有两个导入:

import lxml
import caldav

在这个目录下,我输入:

python test.py

结果一切正常,没有任何问题。

现在我把这个脚本移动到一个名为test的子目录,然后运行命令:

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 个回答

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')

撰写回答