0

Python から 'sed' を呼び出そうとしていますが、subprocess.check_call() または os.system() を介してコマンド ラインを渡す際に問題が発生しています。

私はWindows 7を使用していますが、Cygwinの「sed」を使用しています(パスにあります)。

Cygwin シェルからこれを行うと、正常に動作します。

$ sed 's/&amp;nbsp;/\&nbsp;/g' <"C:foobar" >"C:foobar.temp"

Python では、"name" で作業しているフル パス名を取得しています。私は試した:

command = r"sed 's/&amp;nbsp;/\&nbsp;/g' " +  "<" '\"' + name + '\" >' '\"' + name + '.temp' + '\"'
subprocess.check_call(command, shell=True)

すべての連結は、入力ファイル名と出力ファイル名を二重引用符で囲んでいることを確認するためにあります (Windows ファイル パスに空白がある場合)。

また、最後の行を次のように置き換えてみました。

os.system(command)

いずれにせよ、次のエラーが表示されます。

sed: -e expression #1, char 2: unterminated `s' command
'amp' is not recognized as an internal or external command,
operable program or batch file.
'nbsp' is not recognized as an internal or external command,
operable program or batch file.

それでも、私が言ったように、コンソールからは問題なく動作します。私は何を間違っていますか?

4

3 に答える 3

5

サブプロセスで使用されるシェルは、おそらく必要なシェルではありません。でシェルを指定できますexecutable='path/to/executable'。異なるシェルには、異なる引用ルールがあります。

さらに良いのはsubprocess、完全にスキップして、これを純粋な Python として記述することです。

with open("c:foobar") as f_in:
    with open("c:foobar.temp", "w") as f_out:
        for line in f_in:
            f_out.write(line.replace('&amp;nbsp;', '&nbsp;'))
于 2012-07-24T01:52:41.197 に答える
1

Ned Batchelder の評価に同意しますが、Python のfileinputモジュールを使用して簡単に実行できる、最終的に達成したいことを行う可能性が高いため、次のコードを使用して何を検討したいかを考えてください。

import fileinput

f = fileinput.input('C:foobar', inplace=1)
for line in f:
    line = line.replace('&amp;nbsp;', '&nbsp;')
    print line,
f.close()
print 'done'

これにより、キーワードの使用が示唆するように、指定されたファイルが効果的に更新されます。backup=上記では使用されていませんが、必要に応じて元のファイルのコピーを保存するオプションのキーワードもあります。

ところで、C:foobarファイル名を指定するようなものを使用する場合の注意点は、Windows では現在のディレクトリがドライブ C: にある場合にその名前のファイルを意味するためです。

于 2012-07-24T02:52:38.483 に答える
1

Windows Python では、実際には CygWin シェルを使用cmd.exeしてコマンドを実行するのではなく、 .

そして、cmdそのように一重引用符ではうまく機能しませんbash

それを確認するには、次のことを行うだけです。

c:\pax> echo hello >hello.txt

c:\pax> type "hello.txt"
hello

c:\pax> type 'hello.txt'
The system cannot find the file specified.

Python 自体を使用してファイルを処理するのが最善の方法だと思います。Python 言語はクロスプラットフォーム言語であり、先ほど見つけたようなプラットフォーム固有の矛盾をすべて取り除くことを目的としています。

于 2012-07-24T01:54:56.137 に答える