私は Linux を使用しており、別の Python スクリプトから呼び出したい 1 つの Python スクリプトがあります。私はそれをモジュールとしてインポートしたくありません(セキュリティの層のため、そしてこれを理解したいので今は学術的な演習のために)、実際には os.system() またはそのような別の関数を作成し、他のスクリプトにタプルのリストを最初のスクリプトに返させます。
これが最適な方法ではないことは承知していますが、試して、その過程でいくつかのことを学びたいと思います。
モジュールのインポートは、スクリプトとしての実行とは異なります。子 Python スクリプトを信頼しない場合。そこからコードを実行しないでください。
別の Python モジュールのコードを使用する通常の方法:
import another_module
result = another_module.some_function(args)
インポートする代わりに実行したい場合:
namespace = {'args': [1,2,3]} # define __name__, __file__ if necessary
execfile('some_script.py', namespace)
result = namespace['result']
execfile()
Python ではめったに使用されません。デバッガー、プロファイラー、または 、 などのツールでの実行に役立つ場合がありsetup.py
ます。pip
easy_install
runpy
モジュールも参照してください。
別のスクリプトが別のプロセスで実行された場合。多くのIPC メソッドを使用できます。最も簡単な方法は、シリアル化された (バイト文字列に変換された Python オブジェクト) 入力引数をサブプロセスの stdin にパイプし、@kirelaginによって提案されているように、stdout から結果を読み取ることです。
import json
import sys
from subprocess import Popen, PIPE
marshal, unmarshal = json.dumps, json.loads
p = Popen([sys.executable, 'some_script.py'], stdin=PIPE, stdout=PIPE)
result = unmarshal(p.communicate(marshal(args))[0])
どこにあるsome_script.py
可能性があります:
#!/usr/bin/env python
import json
import sys
args = json.load(sys.stdin) # read input data from stdin
result = [x*x for x in args] # compute result
json.dump(result, sys.stdout) # write result to stdout
とても簡単です。
import popen2
fout, fin = popen2.popen2('python your_python_script.py')
data = fout.readline().strip()
if data <> '':
# you have your `data`, so do something with it