2016-10-19 27 views
0

PythonでLinuxコマンドを実行します。popenの引数へのパスの追加

/usr/bin/myprogram --path "/home/myuser"

私はこれを試してみた:

path = "/home/myuser" 
args = ['/usr/bin/myprogram', '--path ' + path] 
proc = subprocess.Popen(args) 

そして、この:これは、端末で動作

path = "/home/myuser" 
args = ['/usr/bin/myprogram', '--path "' + path + '"'] 
proc = subprocess.Popen(args) 

をしかし、パスの書式設定をmyprogram受け付けません。私はシェルとして実行していないときにパスが異なって動作することを知っていますが、動作させることはできません。また、パスを二重引用符で囲むのではなく、一重引用符で囲んでみました。 Windows上でも動作するソリューションのボーナスポイント(異なるプログラムパスを使用していることは明らかです)。

編集:申し訳ありませんが、メモリからこれを書き出し、スラッシュの代わりにバックスラッシュを使用していました。実際のコードでは、スラッシュ(正しい)を使用していました。

import subprocess 
import shlex 

p = subprocess.Popen(shlex.split("/usr/bin/myprogram --path /home/myuser") 

マインドスラッシュ( "/"):

+1

あなたは 'args = ['\ usr \ bin \ myprogram'、 '--path'、path]'を試したことがありますか?私は以前は成功していましたが、Windows上で使用しました。 EDIT - '\\' – asongtoruin

+0

を使ってバックスラッシュをエスケープする必要があるかもしれない '' subprocess.Popen( '/ usr/bin/myprogram --path "/ home/myuser"'、shell = True、stdout = subprocess.PIPE) .stdout.read() ' –

+0

' ['/ usr/bin/myprogram'、 '--path'、path] 'を使わないのはなぜですか? –

答えて

0

はここで試して何か。私が読んだところでは、PythonはWindows上で実行していても、バックスラッシュ( "\")を好きではありません(Windowsで自分自身を使ったことはありません)。

-1

問題は文字列リテラルの'\usr\bin\myprogram'から発生します。 escaping rulesによれば、\b\x08に置き換えられているため、実行ファイルは見つかりません。

しゃれあなたの文字列リテラルの前にr(即ちr'\usr\bin\myprogram')、またはバックスラッシュを表すために\\を使用して(すなわち、'\\usr\\bin\\myprogram')。

+0

何が間違っているのかコメントしますか? –

関連する問題