web-dev-qa-db-ja.com

pythonモジュールを実行せずにインポートする

別のpythonファイル内で何かを実行するファイルから1つの関数のみをインポートする必要がありますが、関数をインポートすると、必要な関数だけをインポートするのではなく、コード全体が実行されます。ありますか?とにかく、コード全体を実行せずに、別の.pyファイルから1つの関数のみをインポートしますか?

11
Me Man

another.pyで、実行したくないコードを、スクリプトがインポートされただけでなく、スクリプトの実行が明示的に呼び出された場合にのみ実行されるブロックに移動します。

def my_func(x):
    return x

if __name__ == '__main__':
    # Put that needs to run here

これで、your_script.pyにいる場合、anotherモジュールをインポートでき、my_func関数はインポート時に実行されません。

from another import my_func # Importing won't run the function.
my_func(...) # You can run the function by explicitly calling it.
18
bakkal

問題の関数を別のファイルに移動して、ファイルにインポートすることができます。

しかし、インポートですべてを実行しているという事実から、インポートしたモジュール内のほとんどのものを関数に移動し、メインガードを使用して必要な場合にのみそれらを呼び出す必要があると思います。

def print_one():
    print "one"

def print_two():
    print "two"

def what_i_really_want_import():
    print "this is what I wanted"


if __name__ == '__main__':

    print_one()
    print_two()

あなたがおそらく持っているものではなく、私が思うに

print "one"

print "two"

def what_i_really_want_import():
    print "this is what I wanted"

メインガードを使用すると、インポート時に関数内のすべてが実行されませんが、必要に応じて呼び出すことができます。 name == "main"は、実際には「このスクリプトをコマンドラインから実行していますか?」を意味します。インポート時に、if条件はfalseを返すため、print_one()、print_two()の呼び出しは行われません。

インポート時に実行するスクリプトに物事を残すのには、いくつかの理由があります。それらのいくつかは、自動的に実行したい定数、初期化/構成ステップです。また、モジュールレベルの変数を持つことは、シングルトンを実現するための洗練された方法です。

def print_one():
    print "one"

def print_two():
    print "two"


time_when_loaded = time.time()

class MySingleton(object):
    pass

THE_ANSWER = 42
singleton = MySingleton()

しかし、概して、ロード時に実行するためにあまり多くのコードを残さないでください。そうしないと、まさにこれらの問題が発生します。

4
JL Peyret

インポートしようとしている他のpythonスクリプトでは、スクリプトの実行時に実行する必要のあるすべてのコードを次のifブロック内に配置する必要があります-

if '__main__' == __name__:

そのpythonファイルをスクリプトとして実行する場合のみ、__name__変数は__main__。スクリプトをインポートすると、このif条件内のコードは実行されません。

2
Anand S Kumar