5

Python アプリケーションから外部プログラムを呼び出そうとしていますが、出力が表示されず、エラー 127 で失敗します。コマンド ラインからコマンドを実行すると正常に動作します。(そして、私は正しい作業ディレクトリにいます)

def buildContris (self, startUrl, reportArray):
    urls = []

    for row in reportArray:
        try:
            url = subprocess.check_output(["casperjs", "casper.js", startUrl, row[0]], shell=True)
            print (url)
            urls.append(url)
            break
        except subprocess.CalledProcessError as e:
            print ("Error: " + str(e.returncode) + " Output:" + e.output.decode())          

    return urls

各ループは次のエラーを出力します: (e.cmd も確認しました。これは正しいですが、長いので、この例では省略しました)

Error: 127 Output: 

解決:

次のコードが機能します

app = subprocess.Popen(["./casperjs/bin/casperjs", "casper.js", startUrl, row[0]], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env = {"PATH" : "/usr/local/bin/:/usr/bin"}, universal_newlines=True)
app.wait()
out, errs = app.communicate()
4

4 に答える 4

2

subprocess.check_output() 呼び出しで casperjs へのフル パスを追加してみてください。

編集:2番目の質問に答えます。私はiPadを使用しているため、フォーマットについてお詫び申し上げます。環境変数を指定できるように、check_output の代わりに Popen を試す必要があると思います。

p = subprocess.Popen(["/path/to/casperjs", "casper.js", startUrl, row[0]], env={"PATH": "/path/to/phantomjs"})
url, err = p.communicate()
于 2013-09-06T05:46:18.480 に答える
1

shell=Truedocs から、呼び出しの最初の引数 ( args)の解釈を変更します。check_output()

Unix で shell=True, ... args がシーケンスの場合、最初の項目はコマンド文字列を指定し、 追加の項目はシェル自体への追加の引数として扱われます。つまり、Popen は以下と同等のことを行います。

Popen(['/bin/sh', '-c', args[0], args[1], ...])

終了ステータスは、シェルがプログラム127を見つけられなかったか、シェル自体がそのコードで終了したことを意味する場合があります。casperjscasperjs

コードを修正するには:プログラムshell=Trueへのフル パスをドロップして指定します。casperjs

url = check_output(["./casperjs", "casper.js", startUrl, row[0]])
于 2013-09-06T09:34:40.413 に答える