2016-08-25 10 views
1

だから私はデスクトップアプリケーションに小さなスクリプトとウェブ開発から移動することによって、私の知識とPythonのスキルを拡大しようとしている、といくつかのトラブルsetup.pyと、彼らは輸入に与える影響とエントリポイントを理解することを持っています。 Pythonでどのようにインポートが機能するかについて深く理解していませんが、これは役に立ちません。絶対輸入とエントリポイント

私の混乱は、大きなデスクトップアプリケーション、特にDeluge、Pythonで書かれたBitTorrentにアプリのサンプルコードを見てから来ています。 setup.pyで定義されているように、興味深いことに

# deluge/core/core.py 
import deluge.common 
from deluge.core.eventmanager import EventManager 

しかし、すべてのそれのエントリポイントプログラムの中にも深いです:それはのコードを見てみると

は、それ自身のモジュールのすべての輸入は、たとえば、絶対的であることを思わ

# setup.py 
entry_points = { 
    'console_scripts': [ 
     'deluge-console = deluge.ui.console:start', 
     'deluge-web = deluge.ui.web:start', 
     'deluged = deluge.core.daemon_entry:start_daemon' 
    ], 
    'gui_scripts': [ 
     'deluge = deluge.ui.ui_entry:start_ui', 
     'deluge-gtk = deluge.ui.gtkui:start' 
    ], 
    'deluge.ui': [ 
     'console = deluge.ui.console:Console', 
     'web = deluge.ui.web:Web', 
     'gtk = deluge.ui.gtkui:Gtk', 
    ], 
} 

this SO questionの回答によれば、これは通常不可能です。絶対インポートを使用するには、プロジェクトルート内のファイルからプログラムを起動する必要があります。

sys.pathのように、コードの検索では1つのインスタンスしか見つかりませんが、実際のソフトウェアではなくドキュメンテーションに関連しているように見えます。コード。

それでは、どの一つは、モジュール内のより深い彼らのPythonプログラムのエントリポイントを持っていますが、プロジェクトのルートからの絶対importを使うのでしょうか?大洪水はそれをしたようだが、私はどのようにして、私は私のプロジェクトでそれをしたいと思います。

そして、あなたは私が例のために見ることができるというPythonで書かれた任意の他の大規模なデスクトップアプリケーションを知っているならば、あなたはそれについて私に言った場合はサイドの問題として、私はそれを愛するだろう:)

乾杯

答えて

0

これらはすべて実際には全く同じことをしています。我々はそれがトップレベルのパッケージ名、大洪水にアクセスしているこの1

'deluge-console = deluge.ui.console:start' 

のようなラインを持っているエントリポイントで

。その中で、それはuiモジュールに入り、そこのファイルはconsole.pyと呼ばれます。そのファイルには 'start'の定義があります。インストール後、コマンドラインから呼び出されると、インストールされているPythonモジュールにアクセスし、最終的には実行したい機能にアクセスします。

ファイル自体には、このような行があります。

from deluge.core.eventmanager import EventManager 

インストールパッケージの大洪水に入ります。モジュール 'core'に移動すると、eventmanager.pyというファイルが見つかります。そのファイルには、EventManagerというクラスがあります。

は、それぞれのケースでは、インストール済みのパッケージにアクセスし、そして最後に、その後のモジュールおよびサブモジュール、そしてあなたが望むことを何でも実際のオブジェクト機能のクラスに関する情報を提供しています。