起動 - pythonからpythonを実行 subprocess




サブプロセスを使用して、Pythonスクリプト内の入力でPythonスクリプトを呼び出す (2)

スクリプト a.py あり、実行中にユーザーに特定のクエリを要求し、出力をjson形式でフレーム化します。 pythonサブプロセスを使用して、このスクリプトを b.py という名前の別のスクリプトから呼び出すことができます。 変数で出力を取得できないことを除いて、すべてが期待どおりに機能していますか? Python 3でこれを行っています。


言及されたものとは別の方法は、組み込みのfuntion exec を使用することです
この関数は、Pythonコードの文字列を取得して実行します
スクリプトファイルで使用するには、次のように単純にテキストファイルとして read ことができます。

#dir is the directory of a.py
#a.py, for example, contains the variable 'x=1'
exec(open(dir+'\\a.py').read())
print(x) #outputs 1

subprocess モジュールを使用して別のスクリプトからPythonスクリプトを呼び出し、入力を渡してその出力を取得するには:

#!/usr/bin/env python3
import os
import sys
from subprocess import check_output

script_path = os.path.join(get_script_dir(), 'a.py')
output = check_output([sys.executable, script_path],
                      input='\n'.join(['query 1', 'query 2']),
                      universal_newlines=True)

get_script_dir() 関数はここで定義されています 。

より柔軟な代替方法は、モジュール a をインポートし、関数を呼び出して結果を取得することです(インポート時に望ましくないコードが実行されないようにするため、 if __name__=="__main__" ガードを使用していることを確認してください):

#!/usr/bin/env python
import a # the dir with a.py should be in sys.path

result = [a.search(query) for query in ['query 1', 'query 2']]

mutliprocessing を使用して、各クエリを個別のプロセスで実行できます(クエリの実行がCPUに負荷を mutliprocessing 場合、時間パフォーマンスが向上する可能性があります)。

#!/usr/bin/env python
from multiprocessing import freeze_support, Pool
import a

if __name__ == "__main__":
   freeze_support()
   pool = Pool() # use all available CPUs
   result = pool.map(a.search, ['query 1', 'query 2'])




subprocess