2016-11-12 23 views
0

I)はsubprocess.Popenを(使用してメモ帳を開くには、スクリプトを書いていsubprocess.Popenと相対ディレクトリ

import subprocess 
command = '%windir%\system32\\notepad.exe' 
process = subprocess.Popen(command) 
output = process.communicate() 
print(output[0]) 

これはFileNotFoundError

をスローしますが、それは、上記に追加/変更することは可能です相対パスで動作させるコードですか? 私はC:\ Windows>からスクリプトを実行しようとしましたが、そこに移動したが失敗しました。また、shell = Trueを設定しますが、失敗しました。 os.popen()を使用して同様のスクリプトを書くと、スクリプトが実行されるディレクトリに関係なく、相対パスで正常に動作しますが、私が理解している限り、popenは前方の方法ではありません。

プログラミング/ Python。すべての入力は非常に感謝します。

答えて

0

使用os.path.expandvars

subprocess.Popen%windir%などの環境変数は展開されません。シェルはあなたかもしれませんが、実際にはshell=Trueに依存してはいけません。

1

Proのヒント:システムにコマンドの実行を要求するエラーが表示された場合は、コマンド(および該当する場合は現在の作業ディレクトリ)を印刷します。結果はしばしばあなたを驚かせるでしょう。

あなたのケースでは、ちょうどバックスラッシュがないと思われます。代わりにこれを使用します。

command = '%windir%\\system32\\notepad.exe' 

あなたがその変更を行う前に、すぐに割り当てた後commandの値を印刷してみてください。私はあなたが "システム"の先頭の "s"が見つからないと思うし、間違いが明らかであると思う。

HTH。

command = os.path.expandvars('%windir%\\system32\\notepad.exe') 

結果は、その後subprocess.Popenに渡すことができるパスです。%windir%を拡大する

+0

チップをありがとう。私は\ system32の前に\または\\を両方試してみましたが、プリントは同じでした。 – mdn

0

生の文字列を使用すると、バックスラッシュを二重にする必要がなくなります。

command = r'%windir%\system32\notepad.exe' 
+0

ありがとうございます。パンダでも同じことが分かっていますか? DataFrame.index = DataFrame.index.str.replace(r '(string_to_replace'、 'new_string')?)私は正規表現を呼び起こしたと思っていましたが、今はあなたが書いたように生の文字列を表していると思います。 DataFrame.index.str.replace(r '(\ s \。* \)'、 'new_string')の形式の式です。したがって、混乱します。 – mdn

関連する問題