ファイルパスを文字列として受け取り、解析し、コマンド名を追加し、リストを作成して実行するためにsubprocess.Popen()
に渡すPythonスクリプトを作成しています。このスクリプトは、UnixとWindowsの両方のファイルパスを処理するもので、最終的には両方のシステムで実行する必要があります。Pythonでの特殊文字の自動エスケープを防ぐ方法
これをUnixで実行すると、誤ってエスケープ文字(たとえば\Users\Administrator\bin
)が含まれているWindowsパスを指定すると、Pythonは埋め込みの\b
をバックスペース文字として解釈します。私はそれが起こらないようにしたい。
私が知る限り、文字列変数を生の文字列として表す関数やメソッドはありません。 'r'
修飾子は、文字列定数に対してのみ機能します。
はこれまでのところ、私が得ることができました最も近いがこれです:この時点で
winpath = "C:\Users\Administrator\bin"
winpath = winpath.replace('\b','\\b')
winpathlist = winpath.split('\\')
、winpathlistは['C:','Users','Administrator','bin']
、ないが含まれている必要があります。 \a
、\f
、\n
、\r
、\t
、\v
- - ではなく\x
私は私が得るかもしれない他のエスケープを処理するためにwinpath.replace()
に追加コールを追加することができます。
これを行うにはもっとpythonicな方法がありますか?
どのように文字列に値を取得していますか? Pythonは\ bを文字列リテラルに入れない限りエスケープとして扱ってはいけません。あるいは、文字列の先頭にエスケープ文字として入ります。 (また、フォワードスラッシュは正常に機能します) – geoffspear
@Wooble:今、doctest経由で入ってきます。 >>> myCommandObject。 ここで、myCommandObjectにはコマンド名(「ps」など)、パス、および引数のリストが含まれています。 スラッシュをバックスラッシュからスラッシュに変更することは選択できません。私の顧客は、これが彼が望んだものであることを明示した。 – poltr1
私が言ったように、rは文字列リテラルでしか機能しません。文字列変数では機能しません。私は先導的なrをklugeとして見る。 とにかく、ここでdoctestの(またはその一部)があります: >>> myCommand.setExecutablePath( 'C:\プログラムファイル\ cygwinの\ cdrive \ binに') >>> myCommandList = myCommand.getLaunchList() >> > myCommandList ['C:\\\\プログラムファイル\\\\ cygwin \\\\ cdrive \\\\ bin \\\\ ps'、 '-e'、 '-f'] >>> myCommandList [0] .split( "\\\\") ['C:'、 'プログラムファイル'、 'cygwin'、 'cdrive'、 'bin'、 'ps'] 私はもはやエラーが発生しました。 – poltr1