2017-12-20 9 views
0

私は職場で使用される一連のスクリプトを自動化することで問題を解決しようとしています。私は初心者ですので、簡単な質問(うまくいけば)である可能性があることをお詫びしますが、私は文献を読んでいますが、それは私にはあまり意味がありません。os.wait()を適切に使用していますか?

本質的に私はpythonスクリプトとRスクリプトを実行するbashスクリプトを持っています。これは、現在実行されているコードがRスクリプトであり、Pythonが終了する前に開始しています。私のpythonスクリプトとしてのシェル待機関数は子プロセスを起動し、シェル待機は孫プロセスの待機に使用できません。

これは素晴らしいので、PythonとRスクリプトを自分の子プロセスで待機させ、終了時にbashスクリプトを適切に実行できるようにしました。残念ながら私はPythonスクリプトでこれの適切な命名法を理解することはできません。

は、ここで私が持っているものです。

「入力」は私たちが基本的に私が把握しようとしています:)

をやっているまさに私のコード、私はおそらくちょうどカントシェアの実際の入力である

cmd = "python %s/create_keyfile.py %s %s %s %s" %(input, input, input, 
input, input)  
print cmd 
os.system(cmd) 

cmd = "python %s/uneak_name_plus_barcode_v2.py %s %s %s %s" %(input, 
input, input, input, input) 
print cmd 
os.system(cmd) 

cmd = "python %s/run_production_mode.py %s %s %s %s %s" %(input, input, 
input, input, input, input) 
print cmd 
os.system(cmd) 

終了する前に、スクリプト全体をこれら3つのスクリプトで待つ最良の方法を出してください。

EDIT:これを助けてくれてありがとう、ここで私はこのことを探しているGoogleのジレンマを引き起こしました。私はtime import sleepから "python -c"を挿入することを決めました。最初の2つのPythonスクリプトが期待どおりに待っていたことを、スリープ(30) ""私のコードに書き留めました。その末尾に "&"があり、それを待つコマンドは無視されていました。これを単に削除すると、すべてのコードが順番に実行されました。&

+1

os.system()はすでにブロッキング呼び出しです。つまり、完了するまで既に戻りません。あなたのpythonスクリプトがデーモン化しない限り、親は子プロセスを終了する前に子プロセスをブロックする必要があります。彼らがデーモン化するなら、あなたはpsかtopでプロセスをチェックする必要があります。私は問題が実際にはおそらくバックグラウンドでスクリプトを実行しているBASHスクリプトにあると推測します。 python -c "from time import sleep; sleep(30)" bashスクリプトの実行に90秒かかることがあります。 – sehafoc

+0

BTW、 'shell = True'が危険な理由については、https://docs.python.org/2/library/subprocess.html#frequently-used-argumentsの警告を参照してください。これは**すべての**メソッドに当てはまります'os.system()'が同じ危険に晒されていることを意味します(同じ理由で使用すべきではありません)。 –

+0

...具体的には、あなたの 'input'の中に' $(rm -rf〜) 'が含まれているとしましょう - あなたがシェルによって実行されることは望ましくありませんが、あなたの '%s'プレースホルダの代わりに使用されます。 –

答えて

0

使用subprocess.check_call()ないos.system()

subprocess.check_call()関数が値を返したまで、あなたのメインのPythonスクリプトの実行をブロックします。

Documentation for check_call() here

subprocessモジュールは常にサブプロセスの管理と実行のための代わりにos.system()を使用する必要があります。

+0

これは一般的に良いアドバイスですが、 'os.system()'もブロックします。 –

+0

...言い換えれば、私は、このアドバイスに従うことでOPの質問が合理的に尋ねられると解釈される問題を解決する方法を見ていない。 –

+0

あなたはそうです、 '' os.system() ''がブロックされていたのを忘れました。何年も使っていない。 :)ありがとう – seventyseven

関連する問題