簡體   English   中英

python導入的奇怪行為

[英]Strange behavior with python import

因此,我試圖導入包含目錄“ bar”和“ wiz”的模塊“ foo”。 “ bar”包含python文件a.py,b.py和c.py。 “ wiz”包含python文件x.py,y.py和z.py。

$ ls foo
__init__.py     bar       wiz
$ ls foo/bar
__init__.py     a.py      b.py      c.py
$ ls foo/wiz
__init__.py     x.py      y.py      z.py

在python shell中(更准確地說是django manage.py shell),我鍵入以下內容並查看以下結果:

>>> import foo
>>> dir(foo.bar)
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'a']
>>> dir(foo.wiz)
['__builtins__', '__doc__', '__file__', '__name__', '__path__', 'x', 'y']
>>> foo.wiz.x
<module 'foo.wiz.x' from '/dir/'>
>>> foo.wiz.z
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'z'

為什么只在這里導入某些模塊? 為什么我不能訪問z或b或c? 我認為所有內容都將完全基於包含它們的目錄導入和訪問。 另外,如果導入失敗,則將以靜默方式失敗。

有人知道這是怎么回事嗎?

導入foo ,Python只會加載foo/__init__.py ,而不會(自動)加載foo.barfoo.wiz 因此,嘗試在不顯式導入它們的情況下訪問它們將引發AttributeError

如果某些模塊導入了諸如foo.barfoo.bar.a類的子模塊,Python將加載相應的文件並在foo創建對該module對象的引用。 因此,某些模塊可能無需顯式導入即可使用。

如果希望foo.bar始終導出其子模塊abc ,則可以從foo/bar/__init__.py導入它們。 然后,每當導入foo.bar時,這些模塊都將可用。

您尚未導入“ z”(x可能已在其他模塊中導入):

Python 2.4.3 (#1, Jan 14 2008, 18:31:21)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> foo.wiz
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'wiz'
>>> from foo import wiz
>>> foo.wiz
<module 'foo.wiz' from 'foo/wiz/__init__.pyc'>
>>> from foo.wiz import x
>>> foo.wiz.x
<module 'foo.wiz.x' from 'foo/wiz/x.pyc'>
>>> foo.wiz.z
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'z'
>>> import foo.wiz.z
>>> foo.wiz.z
<module 'foo.wiz.z' from 'foo/wiz/z.py'>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM