【问题标题】:Python path explained: import from a subpackagePython 路径解释:从子包导入
【发布时间】:2014-01-25 15:49:09
【问题描述】:

这个问题详细描述了我无法向自己解释的行为。

src/package/__init__.py 为空但存在。

src/package/subpackage/__init__.py:

pink = 'It works'

src/package/test/test.py:

import package.subpackage as subpackage
# I also tried `import package.subpackage as subpackage

print subpackage.pink

src 调用:python package/test/test.py 只是以ImportError: No module named subpackage 失败。请注意import package 也不起作用。

注意:(从src 运行解释器并输入导入语句效果很好。

我应该明白我不应该调用包的子文件吗?在我的项目中,它是一个测试文件,所以听起来对我来说是合乎逻辑的。

为什么当前工作目录不在导入路径中?

非常感谢那些阅读和回答的人。

【问题讨论】:

  • 你的包目录和子包目录是否包含一个名为__init__.py的文件?

标签: python python-2.7 path pythonpath


【解决方案1】:

因为你的包不在 $PYTHONPATH 中。如果你要调用 test.py,你可以将你的 test.py 文件移动到 src/ 目录,或者将 src 添加到 $PYTHONPATH

PYTHONPATH="/path/to/src:$PYTHONPATH"
export PYTHONPATH

来自文档

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件

>>> import sys
>>> sys.path

输出是这样的

['.', '/usr/bin', ...

这意味着当前目录也在 sys.path 中。如果要导入模块,请确保模块路径在 sys.path 中,方法是将包目录添加到环境变量 PYTHONPATH,或者将当前目录或脚本目录更改为包目录。

【讨论】:

  • 我试过它确实有效,但你能告诉我为什么吗?当前工作目录应该在路径中不是吗?
  • @AsTeR 已编辑答案。
  • 所以我在做什么应该有工作?从src 运行命令应该可以根据您所说的使包可见。
  • @AsTeR sys.path 从以下位置初始化:1) 包含输入脚本的目录(或当前目录)。 ... 来自 (docs.python.org/2/tutorial/modules.html#the-module-search-path)
  • 你的输入脚本在 package/test/
【解决方案2】:

python package/test/test.py 失败时,它也是从 src 运行的

  1. 当你从src启动解释器时,''sys.path,所以可以找到src的路径;
  2. 当您从src 运行python package/test/test.py 时,sys.path 中缺少'',尽管os.path.abspath('.') 显示当前目录是"<xxx>\\src""<xxx>\\src" 不在sys.path 中,而@9876543在sys.path。也就是说,python 将 文件路径 添加到 sys.path,而不是您运行脚本的路径。

what the docs says:

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

【讨论】:

  • 不,阅读问题:python package/test/test.py 失败,它也是从src 运行的。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多