Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在Python 2.7中导入自己的包_Python_Python 2.7_Python Import_Sys.path - Fatal编程技术网

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安装它