Python子模块内部引用 - 他们只是疯了吗?

时间:2010-08-05 13:04:38

标签: python module package

道歉为新手提问。我无法理解这一点,而且文档没有帮助!

考虑以下目录结构:

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,那么正确的事情发生了,并且所有模块引用都有效。

BUT

如果我尝试直接执行eggs.py,我会得到ImportError: No module named foo.ham!如果我将foo.ham导入更改为ham,那么正确的事情就会发生......但是我不能import foo.eggs

那么,我该如何开发eggs?如果我使用'undotted'引用,我可以很好地开发,但不能尝试,因为我不能import模块!如果我使用完整的foo.ham引用,我可以导入包,但不能执行子模块用于开发目的!

这只是Python包装架构的一个小问题吗?我做错了吗?

3 个答案:

答案 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目录中的带有虚线引用的当前目录导入模块。 您应该了解模块引用只是此模块的相对路径。所以......解释器无法导入文件系统中找不到的任何模块。