4

私は Linux を使用しており、別の Python スクリプトから呼び出したい 1 つの Python スクリプトがあります。私はそれをモジュールとしてインポートしたくありません(セキュリティの層のため、そしてこれを理解したいので今は学術的な演習のために)、実際には os.system() またはそのような別の関数を作成し、他のスクリプトにタプルのリストを最初のスクリプトに返させます。

これが最適な方法ではないことは承知していますが、試して、その過程でいくつかのことを学びたいと思います。

4

5 に答える 5

4

使用できますsubprocess

subprocess.call(["python", "myscript.py"])

これは、プロセスの戻り値 (0 または 1 など) も返します。

于 2013-06-01T21:16:28.920 に答える
3

モジュールのインポートは、スクリプトとしての実行とは異なります。子 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ます。pipeasy_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
于 2013-06-02T12:42:26.923 に答える
2

リストを返すには、ある種のシリアル化が必要です。pickleまたはJSONをお勧めします。

他のスクリプトはそれをstdout出力し、呼び出し元のスクリプトはそれを読み込んで逆シリアル化します。

于 2013-06-01T21:17:32.567 に答える
0

とても簡単です。

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  
于 2013-06-02T12:57:53.747 に答える