1
import subprocess

sample_file_directory = "..." # directory where file is
SCRIPT_DIR = "..." # directory where script is

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
min_side_len, err = p.communicate()
print len(err)

だから私は、.ply ファイル (3d ファイル形式) を分析し、ファイルに関するデータを提供するこのスクリプトを持っています。ディレクトリ内で破損しているファイルと破損していないファイルを見つけようとしています。そこで、サブプロセス ライブラリを使用してスクリプトを実行し、.ply ファイルの任意の機能 (この場合は最小エッジ長) を見つけようとしています。err に何かが含まれている場合、任意の機能を取得できなかったことを意味し、ファイルが壊れています。ここでは、1 つのファイルに対してのみ実行しています。ただし、エラーが発生し続けます。

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

このエラーが発生する理由を理解できる人はいますか? データ ディレクトリとスクリプト ディレクトリの両方が有効です。あと、肝心なところ抜けててすいません。初投稿です。

4

4 に答える 4

0

問題はここにあります:

p = subprocess.Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

この部分に注目してください:

Popen([SCRIPT_DIR,sample_file_directory,'min','edgelen']

さて、ほら、あなたはそれsubprocessがリストを取ることをすでに知っています。しかし、問題は、ディレクトリをリストの一部として渡していることです。リストは次のようにフォーマットされます。

[コマンド、arg1、arg2...]

このコマンドを実行すると、次のようになります。

[SCRIPT_DIR -> コマンド
sample_file_directory -> arg1
'min' -> arg2
'edgelen' -> arg3]

問題が見えますか?スクリプトのディレクトリを実行するコマンドとして渡し、スクリプトの名前を引数として渡します。モジュールをインポートして、次のosようにします。

p = subprocess.Popen([os.path.join(SCRIPT_DIR,sample_file_directory),'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

これはこれを行います:

[SCRIPT_DIR と sample_file_directory を結合 -> コマンド
'min' -> arg1
'edgelen' -> arg2]

os.path.joinパス区切りを自動的に追加します。

于 2013-06-28T00:22:11.590 に答える
0

SCRIPT_DIR 変数は、スクリプトを実行している場所で有効な絶対パスまたは相対パスですか? 後者の場合、サブプロセスが別の作業ディレクトリを持つ別の環境で開始される可能性があるため、機能しない可能性があります。

于 2013-06-28T00:05:14.620 に答える
0

subprocess.Popen() はパス コンポーネントを結合しません。私が見たところ、あなたはディレクトリを提供しているだけです。Popen に指定されているパスにターゲット実行可能ファイルの名前を追加する必要があります。次のことを試してください。

p = subprocess.Popen([os.path.join(SCRIPT_DIR,SCRIPT_NAME),sample_file_directory,'min','edgelen'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
于 2013-06-27T23:38:06.747 に答える