0

このスクリプトには、python の subprocess.call モジュールを使用する必要があります。次の文字列のファイルを調べる必要があります。

"absolute/path/to/your/lib"

次のように置き換えます。

/var/www/twiki/lib

私のスクリプトは以下のとおりですが、実行すると次のような出力が得られます。

sed: -e expression #1, char 59: unterminated `s' command

Python の subprocess.call モジュールを使用したコマンドは次のとおりです。

subprocess.call(['sed', '-e', 's/\"absolute\/path\/to\/your\/lib\/\"\/var\/www\/twiki\/lib\/', '\/var\/www\/twiki\/lib\/LocalLib.cfg'])

[アップデート]

固定コードは次のとおりです。

subprocess.call(['sed', '-e', 's/\"\/absolute\/path\/to\/your\/lib\"/\/var\/www\/twiki\/lib\//', '/var/www/twiki/bin/LocalLib.cfg'])

結局、いくつかのスラッシュが抜けていて、そのうちの 1 つをダブル スラッシュにする必要がありました。コミュニティなしでは理解できませんでした。

4

2 に答える 2

2
subprocess.call(['sed', '-e', 's/\"absolute\/path\/to\/your\/lib\/\"\/var\/www\/twiki\/lib\/', '\/var\/www\/twiki\/lib\/LocalLib.cfg'])

絶対に不気味に見えます。

まず/、ファイル名の引数で s をエスケープしたのはなぜですか? これは、sコマンドでのみ必要です。

2 つ目: 区切り文字を/から egに置き換える#と、不要なエスケープをすべて省略できます。

私は両方を行ってから得ました

subprocess.call(['sed', '-e', 's#"absolute/path/to/your/lib/"/var/www/twiki/lib/', '/var/www/twiki/lib/LocalLib.cfg'])

そして、私は何を見ますか?コマンドには (つまり、エスケープされていない) はあり#ません。/

試す

's#"absolute/path/to/your/lib/"#/var/www/twiki/lib/#'

ここで、または使用を主張する場合は/、実行してください

's/"absolute\/path\/to\/your\/lib\/"/\/var\/www\/twiki\/lib\//'
                                  ^                          ^

マークされた場所に/sが追加されています。^

編集:"誤解の解消を反映するために、位置を変更しました。以下のコメントを参照してください。

于 2013-11-14T16:10:29.510 に答える
1

他にできることは、生の文字列表記を使用することです。以下の例の文字列の前に「r」があることに注意してください。

import subprocess

COMMAND = r"""
    mysql -u root -h localhost -p --exec='use test; select 1, 2, 3 | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > sample.csv
"""

proc = subprocess.Popen(COMMAND, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
std_out, std_err = proc.communicate()

これは機能しますが、これを行ったのは、bash にこれらのコマンドが大量にあり、Python でラップしたかったからです。Python から直接 mysql を使用し、csv モジュールを使用することをお勧めします。

于 2014-03-14T10:53:59.700 に答える