Can';t在Python 2.7中导入自己的包
在我的程序中导入自己的包时遇到了一些问题,因此我制作了一个测试文件夹,试图了解我做错了什么 这是最简单的事情,但我还是不能让它工作 这是我的文件夹结构:Can';t在Python 2.7中导入自己的包,python,python-2.7,python-import,sys.path,Python,Python 2.7,Python Import,Sys.path,在我的程序中导入自己的包时遇到了一些问题,因此我制作了一个测试文件夹,试图了解我做错了什么 这是最简单的事情,但我还是不能让它工作 这是我的文件夹结构: test > pack1 > __init__.py > mod1.py > pack2 > __init__.py > mod2.py 两个init-文件均为空 mod1如下所示: def foo(): print "hello" 而mod2看起来是这样的 from pack1.
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:没有名为pack1.mod1的模块
是
sys.path.insert(0,“../pack1”)
我的唯一选项,还是cmd不合作的另一个原因?在常规Python中,只有某些文件夹被选中用于导入包,并且您拥有的test
文件夹似乎不是这些文件之一。要更改此设置,请在mod2.py
中编辑sys.path
,然后导入pack1.mod1
mod2.py
import sys
# Add test folder to sys.path
sys.path.append("../")
from pack1.mod1 import *
# Prints "hello"!
foo()
from pack1.mod1 import *
# Prints "hello"!
foo()
另外,您可以将pack1
文件夹添加到Python目录中的Lib
文件夹中,而不是编辑sys.path
。这将起作用,因为默认情况下,这是sys.path
中的一个文件夹
Python 2.7
> Lib
> pack1
> __init__.py
> mod1.py
mod2.py
import sys
# Add test folder to sys.path
sys.path.append("../")
from pack1.mod1 import *
# Prints "hello"!
foo()
from pack1.mod1 import *
# Prints "hello"!
foo()
无论版本如何,python都必须知道在哪里查找包。操纵
sys.path
是一个快速而肮脏的选项,如果您的代码变得更复杂,它有时会中断。尝试制作一个包并通过pip install-e
或python setup.py develope
(请在nice上查找)您说您通过:
(Documents)/test/pack2>pythonmod2.py执行它
import sys
# Add test folder to sys.path
sys.path.append("../")
from pack1.mod1 import *
# Prints "hello"!
foo()
from pack1.mod1 import *
# Prints "hello"!
foo()
问题是pack2.mod2.py
不知道pack1
在哪里
将其作为模块执行:
(文档)/test>python-mpack2.mod2
如果不想修改脚本或目录布局,可以使用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$
vagrant@h:/tmp/test/pack2$python mod2.py
回溯(最近一次呼叫最后一次):
文件“mod2.py”,第1行,在
从pack1.mod1导入*
ImportError:没有名为pack1.mod1的模块
vagrant@h:/tmp/test/pack2$export PYTHONPATH=“${PYTHONPATH}:/tmp/test”
vagrant@h:/tmp/test/pack2$python mod2.py
你好
vagrant@h:/tmp/test/pack2$
关于搜索模块的更多信息-您如何在命令行中执行代码?@Alik(Documents)/test/pack2>pythonmod2.py
“是sys.path.insert(0,../pack1”)我唯一的选项“不,您也可以使用sys.path.apend(/path/to/pack1/)
,然后首先导入sys,但这应该是显而易见的。”操纵sys.path是一个快速而肮脏的选项“这是值得赞许的,但在开发过程中,它可以方便地用于测试目的。当你开始添加代码只是为了适应这种情况时,总有一天,这些额外的代码会咬到你。。。在那里,完成了,将pack1添加到Lib文件夹是不是更容易,或者这也可能会咬到别人?@knitti我喜欢这一个,只是我从来没有创建过完整的包。你知道有什么好的教程吗?@Noble Mushtak:使用Lib文件夹就像使用未记录的功能一样:它可能会工作,但你不知道是否有意外的后果。我不知道python-m,这很方便!但我需要通过进口来实现这一点;这只是一个测试来显示我的问题,但是我需要import
来正确地为一个更大的项目工作。对于一个更大的项目,我会创建一个包并通过pip安装它