Python 模組相對參照

來源:互聯網
上載者:User

標籤:glob   relative   mat   top   ted   class   one   back   file   

檔案結構如下

python_directory/├── __init__.py└── app    ├── __init__.py    ├── sub1    │?? ├── __init__.py    │?? └── mod1.py    └── sub2        ├── __init__.py        ├── mod2.py

除了 mod1.py,其他檔案內容都為空白。

mod1.py

print('__name__: {}'.format(__name__))print('__package__: {}'.format(__package__))from ..sub2 import mod2print('Import Successfully!')

如果 __package__ 不為空白,相對參照會根據 __package__ 而不是 __name__[2]。

Relative Import In Non-Package

如果直接執行一個模組,那麼它的 __name____main__。Python 會認為這個模組是一個最頂層的模組,而不管這個模組在檔案系統中的實際位置[1]。

$ pwd/path_to/python_directory$ python app/sub1/mod1.py __name__: __main____package__: NoneTraceback (most recent call last):  File "app/sub1/mod1.py", line 3, in <module>    from ..sub2 import mod2ValueError: Attempted relative import in non-package

一個最頂層的模組 -- 我理解為 Python 把這個模組複製到在一個單獨的目錄中然後再執行,由於該目錄下只有這個一個模組,
所以它不是一個 package。

Beyond Top Level Package
$ pwd/path_to/python_directory/app$ python -m sub1.mod1__name__: __main____package__: sub1Traceback (most recent call last):  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main    "__main__", fname, loader, pkg_name)  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code    exec code in run_globals  File "/path_to/python_directory/app/sub1/mod1.py", line 4, in <module>    from ..sub2 import mod2ValueError: Attempted relative import beyond toplevel package

由於 -m sub1.mod1,Python 將 package 的頂層視為 sub1,而 ..sub2 位於 app/,超過了當前的最頂層 sub1,所以報錯。

└── app    ├── __init__.py    ├── sub1    │?? ├── __init__.py    │?? └── mod1.py    └── sub2
正確的調用
$ pwd/path_to/python_directory$ python -m app.sub1.mod1__name__: __main____package__: app.sub1Import Successfully!

此時 ..sub2 相當於 app.sub2

參考
  1. PEP 328 -- Imports: Multi-Line and Absolute/Relative
  2. PEP 366 -- Main module explicit relative imports

Python 模組相對參照

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.