2

次のテキストがあります。

'sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filter=\'(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) \''

これを分割して、サブプロセス モジュールを使用して実行する必要があります。shlex.split を使ってみました。私は以下を得ました:

['sudo',
 '-S',
 'java',
 '-cp',
 'spinn3r-client-3.4.06.jar',
 'com.spinn3r.api.Main',
 '--vendor=test',
 '--remote-filter=(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) ']

ご覧のとおり、 --remote-filter の後の単一引用符が削除されています。テキストにこれらの一重引用符が必要です。これらの引用符を保存するにはどうすればよいですか?

4

2 に答える 2

1

一重引用符を取り除いても、を使用すると問題なく解釈されるようsubprocessです。

#!/bin/bash
# > someScript
echo ${1} # sudo
echo ${2} # -S
echo ${3} # --vendor=test
echo ${4} # --remote-filter=(simple) (<--space-->)
echo ${5} # --foo
echo ${6} # bar
#!/usr/bin/env python
import subprocess, shlex

subprg = (
    './someScript sudo -S --vendor=test '
    '--remote-filter=\'(simple) (<--space-->) \' --foo bar')

subprocess.call(shlex.split(subprg))

別の方法として、テキストを直接渡すこともできますが、セキュリティ上の問題がいくつかあります。

subprocess.call('./someScript sudo -S ...', shell=True)
于 2013-07-17T22:01:48.113 に答える
0

それはshlex問題ではありません: posix シェルは、実際には一重引用符も消費します:

user@debi:~$ python -c "import sys;print sys.argv" sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filter='(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) '
['-c', 'sudo', '-S', 'java', '-cp', 'spinn3r-client-3.4.06.jar', 'com.spinn3r.api.Main', '--vendor=test', '--remote-filter=(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) ']

引用符の目的は、単にremote-filter引数のスペースを取得することです。したがって、そのままのユースケースで問題ありません。

単一引用符をサブプロセスに入れたい場合は、追加の引用符/エスケープが必要です。

user@debi:~$ python -c "import sys;print sys.argv" sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filter="'(and (eq source:publisher_type \" WEBLOG\") (eq dc_lang:English) '" 
['-c', 'sudo', '-S', 'java', '-cp', 'spinn3r-client-3.4.06.jar', 'com.spinn3r.api.Main', '--vendor=test', '--remote-filter=\'(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) \'']
于 2016-03-08T23:04:34.403 に答える