26

私はscript1.pyどの呼び出しを持っていますscript2.py (subprocess.call([sys.executable, "script2.py"])。しかし、で知られているscript2.py変数が必要です。非常に単純な を試しましたが、うまくいかないようです。xscript1.pyimport x from script1

それは使用する正しいアプローチですか?例えば:

#script1.py
import subprocess, sys
##subprocess.call([sys.executable, 'C:\\...\\Desktop\\script2.py'], shell=True)
##os.system("C:\\...\\Desktop\\script2.py")
subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
print "BLAH"
x = BO

#script2.py
from script1 import x
print "HELLO"
print x

script2 を呼び出す 3 つのケース (subprocess.call、os.system、subprocess.Popen ) はすべて機能しません。「BLAH」は出ますが、「HELLO」は出ません。

4

7 に答える 7

31

正しい構文は次のとおりです。

from script1 import x

つまり、文字通り、「script1.py から "x" オブジェクトをインポートします。」

于 2013-10-10T07:08:14.003 に答える
6

これを試して:

from script1 import x

次のコードを実行したところ、うまくいきました

スクリプト 1:

c = 10

スクリプト 2:

from script1 import c
print c

2 番目のスクリプトは、予想どおり整数 10 を出力しました。

10 月 17 日編集: 現状では、コードは示されているように「Hello」を生成しないか、無限ループに入ります。いくつかの問題:

現状では、BO は定義されていません。script1 を実行すると、script2 のサブプロセスが開かれます。script2 が script1 を呼び出すと、何とか出力されますが、BO が定義されていないため、x=BO で失敗します。

そのため、たとえば文字列で BO を指定して修正すると、無限ループに陥ります (各スクリプトが別のスクリプトを呼び出して、x、Hello、Blah を出力します)。

これを修正する可能性のある方法の 1 つは、関数呼び出しを介して x を渡すことです。したがって、script2 は x を関数パラメーターとして取り、必要なことは何でも実行できます。

于 2013-10-10T07:11:35.737 に答える
5

呼び出しがモジュール初期化コードにあるため、コードがループしているため、subprocess.Popenscript1 をインポートするときに script2 によって呼び出されます (script1 もインポートする新しい script2 プロセスを作成します ...)

Python ファイルをスクリプトとモジュールの両方として使用できるようにするための推奨される方法__name__は、変数を使用することです。

#script1.py

x = BO

if __name__ == "__main__":
    import subprocess, sys
    subprocess.Popen("C:\\...\\Desktop\\script2.py", shell=True)
    print "BLAH"

ただし、これは定数に対してのみ機能することも考慮してください。実行時に変更できる場合xは、実際のプロセス間通信メソッドが必要になります。

于 2013-10-17T09:30:10.337 に答える
2

スクリプト 0:

#!/usr/bin/env python
from script1 import x

print x

スクリプト 1:

#!/usr/bin/env python
x = "Hello world"

出力:

Hello world

ええ、それは機能します。サブプロセスは必要ありません。

于 2015-11-20T07:38:07.940 に答える
0

script2.py でモジュール名 (つまり script1.x) を前に付けて、変数を参照する必要があると思います。

于 2013-10-10T07:07:59.053 に答える