【问题标题】:Python script import fails if script is moved to subdirectory如果将脚本移至子目录,则 Python 脚本导入失败
【发布时间】:2010-11-20 14:57:43
【问题描述】:

这可能是我自己对Python导入和搜索路径工作原理的误解,也可能是caldav包的打包问题。

我已经建立了一个名为 myproject 的 virtualenv 环境

在 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

我在这里做错了吗?我应该设置某种路径吗?

【问题讨论】:

    标签: python virtualenv


    【解决方案1】:

    很可能,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')
    

    【讨论】:

    • 由于这是一个virtualenv环境,所以caldav存在于myproject/lib/site-packages/caldav中。我尝试将 PYTHONPATH 设置为此位置,但没有帮助。
    • 我刚刚发现在 test 子目录下有一个虚假的 caldav 安装,这把一切都搞砸了。我已经接受了 birryree 的回答,因为它帮助我找到了问题的根本原因。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2014-03-22
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多