フォルダをループするPythonスクリプトがあり、ファイルごとにシェルコマンドが作成されます。サブプロセスを使用してシェルスクリプトを呼び出すと、シェルスクリプト内のすべてのコマンドが実行されない
各コマンドはシェルスクリプトに書き込まれ、このスクリプトはsubprocess.Popenを使用して実行されます。 (コマンドを実行する前に環境を設定する必要があるため、これを行う必要があります)。ここで
は、いくつかの擬似コードです:私はこのPythonスクリプトを実行すると
def create_shell_script(self):
'''loop through a folder, create a command for each file and write this to a shell script'''
# command to run
base_command="run this"
#list of files
command_list=[]
#loop through the files to create a folder
for file in my_folder:
command_list.append(base_command+" "+file)
# open the shell script
scriptname="shell.sh"
shellscript = open(scriptname,'w')
# set the environment using '.' as using bash below to run shell script
shellscript.write("#!/bin/bash\n. /etc/profile.d/set_environment\n")
#loop through commands and write to shellscript
for command in command_list:
shellscript.write(command+"\n")
# use subprocess to run the shell script. Use bash to interpret the environment
cmd="bash "+scriptname
proc = subprocess.Popen([cmd], stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
のみシェルスクリプト内で最初の6つのコマンドが実行されます。コマンドからのエラーメッセージは、コマンドがサブプロセスによって読み取られるときに切り捨てられることを示しています。
シェルスクリプトを手動で実行すると、すべてのコマンドが期待通りに実行されるので、シェルスクリプトが正しいことがわかります。
各コマンドはかなり瞬時ですが、問題の原因となるスピードは想像できません。
ファイルごとにサブプロセスコマンドを実行しようとしましたが、環境を設定するのが難しくなりました。ログファイルとしても機能するため、単一のshスクリプトを作成するアプローチが好きです。
私はサブプロセスのドキュメントを読んだことがありますが、何も発見されておらず、Googleは助けにはなりませんでした。
は、ファイルへの書き込み後、それを実行する前に、シェルスクリプトファイルオブジェクトを閉じてみました:
最もエレガントな解決策は、ファイルを自動的に閉じコンテキストマネージャを使用することですか?そうしないと、実行時にファイルが完全に書き込まれないことがあります。 –
それはそれを修正!ありがとうございました。あなたが答えとしてそれを追加するなら、私はそれを受け入れられたものとしてマークします – aledj2