1

'main.py'というメインファイルと2つのサブフォルダーがあります。1つは「externals」と呼ばれ「easygui.py」を含み、もう1つは「modules」と呼ばれ「gui.py」と呼ばれるファイルを含みます。

プログラムはmain.pyから開始されます

main.pyにeasyguiをインポートしimport externals.easyguiます。modules.guiをインポートするのと同じ方法

しかし、welcome-functionを呼び出すと、easyguiがわからないため、関数にインポートする必要があります。もっとeasygui-functionsを呼び出したいので、すべてのdefにeasyguiをインポートしたくありません。

これはどのように解決できますか?

前もって感謝します!

ステッフェン

例(try /exceptやコメントなしで読みやすくするため):

main.py:

#!/usr/bin/env python

import externals.easygui
import modules.gui

main():
    gui.welcome()

gui.py:

def welcome():
    msgbox("Welcome!", ok_button="Ok")
4

3 に答える 3

3

welcomeそれがにあると仮定するとeasygui.py、次のようになります。

def main():
   externals.easygui.welcome()

これらは入力が面倒になる可能性があるため、サブパッケージを省略名でインポートするのが通例です。

import externals.easygui as eg
def main():
    eg.welcome()

または、を追加してすべてをパッケージにすること__init__.pyができ、そこからインポートされる名前空間を制御できます...


横方向のインポートに関する限り、これが私が設定したテストディレクトリ構造です。

steffen
  |- __init__.py
  |- main.py
  |- easygui
     |- __init__.py
     |- gui.py
  |- external
     |- __init__.py
     |- welcome.py

ここで、(簡単にするために)それぞれ__init__.pyがそのディレクトリに含まれるファイル/モジュールをインポートするだけです。だから、steffenで:

#steffen.__init__.py
import main
import easygui
import external

および外部

#steffen/external/__init__.py
import welcome

などなど。

実際のコードの場合:

main.py:

import easygui
def main():
    easygui.gui.welcome()

easygui / gui.py:

import steffen.external as se
def welcome():
    se.welcome.hello()

external /welcome.py

def hello():
    print "Hello"

これで、これらすべてを使用できます。steffenの親ディレクトリ(パッケージsteffenがPYTHONPATHにあることを確認するため)では、次のことができます。

import steffen
steffen.main.main()

ふぅ!さて、持っているのは少しばかげていsteffen.main.main()ます。関数を単に、として参照したい場合はsteffen.main()、で設定できますsteffen.__init__.py。次のように変更するだけです。

#steffen.__init__.py
from main import main
import easygui
import external

したがって、で関数を呼び出す場合はfoo.func()、をインポートするスクリプトの__init__.pyように呼び出すことになります。同様に、のように関数を呼び出す場合は、steffenをインポートするスクリプトのように呼び出します。うまくいけば、それは理にかなっています。私が思いついたこの最も単純な実例では、消化することがたくさんあります。利点は、これらすべてに取り組み、理解できれば、Pythonパッケージの作成について知っておくべきことのほとんどすべてを知っていることです(ここでも使用できる相対的なインポートや、実際にパッケージをインストールしますが、このことを理解すれば、それらはかなり簡単に理解できます)。steffen.foo.func()steffenfoo()__init__.pysteffen.foo()setup.py

于 2012-10-10T12:22:27.343 に答える
0

他のモジュールのインポートについては知らないため、各ソースファイルには独自のインポートが必要です。ファイルの先頭にをimport externals.easygui含める必要があります。modules.gui.py

例えば。gui.py

from externals.easygui import msgbox

def welcome():
    msgbox("Welcome!", ok_button="Ok")
于 2012-10-10T12:27:14.593 に答える
0

ここにあるもの...

gui.pyモジュールをインポートし、それにguiという名前を付けます。これにより、guiラベルを使用してguiの関数にアクセスする必要があります。

gui.pyモジュールでは、関数msgboxのみをインポートするため、他のものはインポートされません(これが必要な場合)。

これで、プログラムを実行すると、gui.welcome関数を呼び出すメッセージが表示されます。

main.py

import modules.gui as gui

def main():
    gui.welcome()

if __name__ == "__main__":
    main()

サブフォルダーモジュールのgui.py

from externals.easygui import msgbox

def welcome():
    msgbox("Welcome!", ok_button = "Ok")
于 2017-07-09T04:43:51.947 に答える