0

我在我的程序中导入自己的包时遇到了一些麻烦,所以我创建了一个测试文件夹来尝试了解我做错了什么。

这是最简单的事情,但我仍然无法让它工作。

这是我的文件夹结构:

test
> pack1
  > __init__.py
  > mod1.py
> pack2
  > __init__.py
  > mod2.py

两个init文件都是空的。

mod1看起来像这样:

def foo():
    print "hello"

mod2看起来像这样

from pack1.mod1 import *

foo()

在 PyCharm 中运行代码时,一切正常!但是当尝试从 cmd 执行时,我得到了ImportError: No module named pack1.mod1

sys.path.insert(0, "../pack1")我唯一的选择,还是 cmd 不合作的其他原因?

4

4 回答 4

2

无论版本如何,python 都必须知道在哪里寻找包。操作sys.path是一种快速而肮脏的选择,如果您的代码变得更加复杂,它有时会在将来中断。尝试制作一个包并通过pip install -e或安装它python setup.py develop

(在不错的distutils 介绍中寻找这个)

于 2015-04-20T12:07:44.187 回答
0

如果您不想修改脚本或目录布局,您可以使用PYTHONPATH环境变量。

例子

vagrant@h:/tmp/test/pack2$ python mod2.py
Traceback (most recent call last):
  File "mod2.py", line 1, in <module>
    from pack1.mod1 import *
ImportError: No module named pack1.mod1
vagrant@h:/tmp/test/pack2$ export PYTHONPATH="${PYTHONPATH}:/tmp/test"
vagrant@h:/tmp/test/pack2$ python mod2.py
hello
vagrant@h:/tmp/test/pack2$

有关搜索模块的更多信息 - https://docs.python.org/2/tutorial/modules.html#the-module-search-path

于 2015-04-20T12:22:19.210 回答
0

你说你通过以下方式执行它:(Documents)/test/pack2> python mod2.py

问题是pack2.mod2.py不知道在哪里pack1

将其作为模块执行: (Documents)/test> python -m pack2.mod2

于 2015-04-20T12:19:29.320 回答
0

在常规 Python 中,只有某些文件夹被检查以导入包,而test您拥有的文件夹似乎不是这些文件之一。要更改这一点,请编辑sys.path并导入.mod2.pypack1.mod1

mod2.py

import sys
# Add test folder to sys.path
sys.path.append("../")

from pack1.mod1 import *
# Prints "hello"!
foo()

sys.path此外,您可以将pack1文件夹添加到LibPython 目录中的文件夹中,而不是编辑。这将起作用,因为默认情况下,这是sys.path.

Python 2.7
  > Lib
    > pack1
      > __init__.py
      > mod1.py

mod2.py

from pack1.mod1 import *
# Prints "hello"!
foo()
于 2015-04-20T12:06:46.253 回答