道歉为新手提问。我无法理解这一点,而且文档没有帮助!
考虑以下目录结构:
spam.py
foo / __init__.py
ham.py
eggs.py
使用以下代码:
# __init__.py
# blank
# ham.py
print( "got ham!" )
# eggs.py
print( "got eggs, importing ham!" )
import foo.ham
现在,如果我在import foo.eggs
(!)中spam.py
,那么正确的事情发生了,并且所有模块引用都有效。
如果我尝试直接执行eggs.py
,我会得到ImportError: No module named foo.ham
!如果我将foo.ham
导入更改为ham
,那么正确的事情就会发生......但是我不能import foo.eggs
!
那么,我该如何开发eggs
?如果我使用'undotted'引用,我可以很好地开发,但不能尝试,因为我不能import
模块!如果我使用完整的foo.ham
引用,我可以导入包,但不能执行子模块用于开发目的!
这只是Python包装架构的一个小问题吗?我做错了吗?
答案 0 :(得分:1)
foo的父目录需要位于python的路径中:
$ ls foo
eggs.py ham.py ham.pyc __init__.py __init__.pyc
$ python foo/ham.py
got ham!
$ python foo/eggs.py
got eggs, importing ham!
Traceback (most recent call last):
File "foo/eggs.py", line 2, in <module>
import foo.ham
ImportError: No module named foo.ham
$ PYTHONPATH=. python foo/eggs.py
got eggs, importing ham!
got ham!
答案 1 :(得分:1)
这似乎有效:这是目录结构:
~/test/kl% ls -R
.:
foo spam.py
./foo:
eggs.py eggs.pyc ham.py ham.pyc __init__.py __init__.pyc
以下是文件内容:
~/test/kl% cat spam.py
import foo.eggs
~/test/kl% cd foo/
~/test/kl/foo% cat eggs.py
print( "got eggs, importing ham!" )
import ham
我们可以从spam.py和foo / eggs.py:
导入ham~/test/kl% python spam.py
got eggs, importing ham!
got ham!
要记住的有用规则是,当您说python script.py
时,包含script.py
的目录将添加到sys.path
的开头,搜索模块的目录。这就是python spam.py
在不改变PYTHONPATH
的情况下工作的原因。
~/test/kl% python foo/eggs.py
got eggs, importing ham!
got ham!
这里,〜/ test / kl / foo被添加到sys.path
。没关系,因为eggs.py
尝试import ham
。由于ham.py
位于~/test/kl/foo
中的sys.path
,因此Python发现它很好。
~/test/kl% cd foo
~/test/kl/foo% python eggs.py
got eggs, importing ham!
got ham!
目录〜/ test / kl不在我的PYTHONPATH中。
答案 2 :(得分:0)
这是Python的打包架构。通常,模块可以从$ PYTHONPATH目录中的带有虚线引用的当前目录导入模块。 您应该了解模块引用只是此模块的相对路径。所以......解释器无法导入文件系统中找不到的任何模块。