2015-08-09 46 views
1

這個問題是特定於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日的,問題得到解決,請參閱接受的答案。

+0

好像一個pydev錯誤。話雖如此,也許您可​​以嘗試在您的頂層包中添加一個'__main __。py'模塊,並編寫調用您需要的子模塊的Python代碼。 –

+0

@PatrickMaupin你可以擴展*「編寫調用你想要的子模塊的Python代碼」*部分嗎? – Ali

+0

如果您有一個也可以用作應用程序的庫,將應用程序用法與庫用法分開的最簡單方法是使用['__main __。py'](http://stackoverflow.com/questions/4042905/what -is-main-py)文件在您的頂級應用程序中。例如,您可以在其中放置一個解析器,以便決定要執行哪個子模塊。 –

回答

2

編輯:

PyDev 5.4.0,還有現在的使用-m標誌(這將通過定期的名字導入模塊,而不是因爲它是__main__,使相對進口將在那裏工作)來運行的選項。

您可以在以下位置啓用它:Preferences > PyDev > Run(即:這將使其可用於所有運行 - 也許將來會有一個選項可以使其每次運行,但現在它對所有啓動全局設置)。


原來的答覆:

的問題是,你有你的主模塊相對於進口和PyDev的執行文件,而不是python path/to/file_to_execute.pypython -m my.module

一個簡單的修復方法是做一個單獨的主模塊,然後從該模塊導入一個main()函數並運行它(儘管如此:它不能在模塊中執行相對導入,因爲它的執行方式爲__main__(這是因爲模塊被稱爲__main__,因此無法解析相對導入,因爲它實際上並未導入具有可用於解析相對導入的名稱)。

另一個修復程序將更改啓動配置,以將'-m my.module'添加到虛擬機參數(去運行>運行配置來做到這一點 - 但是你必須爲你想要運行的每個主模塊做這些工作,包括單元測試)

而最後的解決將是改變自身的PyDev(所以,請創建一張票,在PyDev的跟蹤:https://www.brainwy.com/tracker/PyDev/ - 或提交pull請求,這將使中添加這個功能要快得多;))

+0

我已經啓用了選項在PyDev中,但是當我「看到最終的命令行」時,我仍然得到了'python -u/full/path/to/file.py',並且仍然有和OP一樣的問題。我重新啓動了Eclipse,看看是否需要它生效 - 同樣的事情。 –