這個問題是特定於PyDev。封裝結構是這樣的:如何使用相對導入在包內運行模塊?
app
├── __init__.py
├── sub1
│ ├── __init__.py
│ └── mod1.py
└── sub2
├── __init__.py
└── mod2.py
的mod1.py
模塊:
from __future__ import print_function
def f():
print('It works!')
的mod2.py
模塊:
from __future__ import absolute_import
from ..sub1 import mod1
if __name__ == '__main__':
mod1.f()
一切從外殼精美的作品中,python -m app.sub2.mod2
命令打印:
It works!
不出所料,一切正常。 (該from __future__ import absolute_import
線似乎沒有任何效果。我可以評論它,一切仍然只是罰款)
如果我在PyDev的IDE點擊mod2
並嘗試Run As
>Python Run
,我得到
ValueError: Attempted relative import in non-package
這並不奇怪,因爲默認情況下-m
開關未打開。如果我編輯mod2
:參數> VM參數的運行/調試設置並在此處添加-m
;該-m
是最有可能傳遞到Python解釋器,但現在我得到:
/usr/bin/python: Import by filename is not supported.
的from __future__ import absolute_import
線似乎沒有任何效果;我是否評論它並不重要;我正在使用Python 2.7。
我在這一點上沒有想法。
在PyDev的,我怎麼能運行使用相對 進口封裝內的模塊?
我應該如何更改一次設置(全局),以便每當我嘗試在包內運行模塊時,PyDev都會做正確的事情? (也就是說,我沒有單獨指定每個 模塊,我想運行的設置。)
親自開發人員證實,這是不可能在目前的PyDev;我爲它打開了一張票。
Running a module inside a package, using relative imports
UPDATE:作爲2016年12月2日的,問題得到解決,請參閱接受的答案。
好像一個pydev錯誤。話雖如此,也許您可以嘗試在您的頂層包中添加一個'__main __。py'模塊,並編寫調用您需要的子模塊的Python代碼。 –
@PatrickMaupin你可以擴展*「編寫調用你想要的子模塊的Python代碼」*部分嗎? – Ali
如果您有一個也可以用作應用程序的庫,將應用程序用法與庫用法分開的最簡單方法是使用['__main __。py'](http://stackoverflow.com/questions/4042905/what -is-main-py)文件在您的頂級應用程序中。例如,您可以在其中放置一個解析器,以便決定要執行哪個子模塊。 –