1

実際にマスターマシンと 3 つのスレーブマシンを持つ 48 コアのクラスターで、Python スクリプトを使用して一連のファイルを生成しようとしています。ファイルのセットを生成し、それらに対していくつかのスクリプトを実行し、結果を収集してから削除する必要があります。ファイルの再生成、実行、削除などのプロセスをもう一度繰り返します。同じ名前のファイルを削除して再生成すると、スレーブマシンがファイルを見つけることができないと不平を言うことがわかります。私はpythonスクリプトを実行していますos.system()

この投稿から、実行に進む前にスクリプトがファイルを生成するのを実際に待つsubprocess.Popen()よりも、使用する方が良いことを学びました。またはをos.system使用して待機することもできますが、os.systems を subprocess.popens または subprocess.calls に変換したいので、ここで立ち往生しています。os.system("pause")time.sleep(whatever)

私はpythonのドキュメントを調べて試してみましたsubprocess.Popen('ls')が、動作するような単純なものを得ることができませんsubprocess.Popen('cd /whatever_directory').

ばかげているように聞こえるかもしれませんが、ではなくcdthroughのような単純なコマンドを実行するにはどうすればよいでしょうか?subprocessos.system('cd')

それでは、実際に以下をサブプロセスに変換したいと思います。どうすればいいのですか?

import os,optparse
from optparse import OptionParser

parser.add_option("-m", "--mod",dest='module', help='Enter the entity name')
parser.add_option("-f", "--folder", dest="path",help="Enter the path")

module=options.module
path=options.path

os.system('python %s/python_repeat_deckgen_remote.py -m %s' %(path,module))

os.system を subprocess.Popen に置き換えました。しかし、それは私に多くの不満を与えました:

File "/usr/lib64/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
4

3 に答える 3

2

仕事のような単純なことを手に入れることができませんsubprocess.Popen('cd /whatever_directory')

各プロセスの現在の作業ディレクトリは、システム内の他のプロセスから独立しています。

(これらのメカニズムのいずれかを使用して) サブプロセスを開始し、それをcd別のディレクトリに移動しても、親プロセス、つまり Python スクリプトには影響しません。

スクリプトの現在の作業ディレクトリを変更するには、os.chdir().

于 2013-03-23T06:58:42.150 に答える
2

NPE が既に述べたように、新しいプロセスは既存のプロセスには影響しません (つまりos.system('cd /some/where')、現在のプロセスにも影響しません)。os.systemただし、この場合、渡されたコマンドを解釈するためにシェルを呼び出すという事実につまずいていると思いますが、デフォルトでsubprocess.Popenはそうしません。ただし、そうするように指示できます。

proc = subprocess.Popen(
    'python %s/python_repeat_deckgen_remote.py -m %s' % (path, module),
    shell = True)
status = proc.wait()

シェル組み込みコマンドを呼び出しているか、シェル拡張を使用している場合は、シェルを呼び出す必要があります (シェルをシミュレートしたくない場合):

>>> import subprocess
>>> x = subprocess.Popen('echo $$')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/local/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
>>> x = subprocess.Popen('echo $$', shell = True); x.wait()
81628
0
>>> 

ただし、問題が許せば、コマンド引数をリストに分割することで、シェルをバイパスできます (セキュリティの問題に役立ちます)。

>>> x = subprocess.Popen(['echo', '$$']); x.wait()
$$
0
>>>

$$今回はシェルが文字列を解釈しなかったため、ここでの出力はプロセス ID ではなく stringであることに注意してください。

たとえば、元の例では、次を使用できます。

proc = subprocess.Popen(['python',
    os.path.join(path, 'python_repeat_deckgen_remote.py'),
    '-m',
    module])

pathおよび/またはmoduleシェルに特殊な文字が含まれている場合の問題を回避します。

(他のことにもよりますが、 を呼び出して への呼び出しsubprocess.Popencwd = path削除したい場合もos.path.joinあります。)

于 2013-03-23T09:47:09.093 に答える
0

私はあなたの質問に直接答えていないかもしれませんが、サブプロセスを実行する必要があるそのようなタスクには、常にplumbumを使用します。

IMO、リモートマシンでの実行を含め、タスクがはるかに単純で直感的になります。

with local.cwd(path): my_cmd()plumbum を使用すると、サブプロセスの作業ディレクトリを設定するために、コンテキストでコマンドを実行できます。

于 2013-03-23T09:33:10.293 に答える