为什么在文件中执行sys.path.append而不是在Python控制台中执行时会出现ImportError?

时间:2012-02-04 12:09:14

标签: python packages

我正在尝试运行一个需要另一个目录中的包的脚本。

这有效:

    在程序包父目录中启动python时
  • execfile("../test.py")
  • sys.path.append("package parent")在python解释器中然后调用execfile("test.py")

这不起作用(提供ImportError):

    在包父目录中
  • python ../test.py
  • python test.py在脚本目录中

test.py文件包含我在解释器中使用的相同sys.path.append指令。在文件中或在解释器中运行它有区别吗?


我的目录结构:

  • test.py
    • stuff.py

我得到的错误消息:

  来自package.stuff的

导入SomeClass
  ImportError:没有名为package.stuff的模块

1 个答案:

答案 0 :(得分:1)

提示为什么交互式shell中的行为与脚本行为不同,可以在sys.path的{​​{3}}中找到:

  

在程序启动时初始化时,此列表的第一项path[0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果以交互方式调用解释器或者从标准输入读取脚本),path[0]是空字符串,它指示Python首先搜索当前目录中的模块。请注意,在PYTHONPATH

的结果插入条目之前插入了脚本目录

这可以解释为什么从交互式shell执行的工作原理。但是,如果没有进一步的信息,只能猜到脚本失败的原因。

设置PYTHONPATH与更新sys.path基本相同。在bash,这将是:

PYTHONPATH=/path/to/package1:/path/to/package2 python test.py

查看docsthis post了解详情。