簡體   English   中英

對帶有引號的參數使用subprocess.run

[英]Using subprocess.run with arguments containing quotes

我正在嘗試運行的命令如下所示:

xvfb-run --auto-servernum --server-args="-screen 0 640x480x24" --error-file=/dev/stdout /opt/myExecutable

這就是我在Python3中所擁有的:

args = ['xvfb-run', '--auto-servernum','--server-args="-screen 0 640x480x24"', '--error-file=/dev/stdout', '/opt/myExecutable']
command = ' '.join(xvfbArgs)
print(f'Command: {command}')
subprocess.run(xvfbArgs)

我得到以下內容:

Unrecognized option: "-screen
use: X [:<display>] [option]
...
segfault
...
Command: xvfb-run --auto-servernum --server-args="-screen 0 640x480x24" --error-file=/dev/stdout /opt/myExecutable

打印的命令正確。

我也嘗試過使用"-server-args='-screen 0 640x480x24'" (取反的"'導致相同的結果( Unrecognized option: '-screen "-server-args='-screen 0 640x480x24'"

發生的事情在subprocess.run改變--server-args="-screen 0 640x480x24"

正確的語法為:

args = [
    'xvfb-run',
    '--auto-servernum',
    '--server-args=-screen 0 640x480x24',
    '--error-file=/dev/stdout',
    '/opt/myExecutable'
]

try:
    from pipes import quote  # Python 2
except ImportError:
    from shlex import quote  # Python 3

command_str = ' '.join(quote(s) for s in args)
print(f'Command: {command_str}')

subprocess.run(args) # or subprocess.run(command_str, shell=True)

請注意,這里根本沒有文字引號-唯一的引號是Python語法。 在bash中,未轉義的引號是語法,而不是數據,即使它們存在於字符串中。

只是不要將命令合並為字符串,然后也不要將引號放在適當的位置以保護字符串不受外殼影響。

args = ['xvfb-run', '--auto-servernum','--server-args=-screen 0 640x480x24', '--error-file=/dev/stdout', '/opt/myExecutable']
print(f'Command: {args}')
subprocess.run(args)

這是一種告訴您傳遞給subprocess.run命令的外觀的簡單方法。 在外殼程序(不是Python,常規外殼程序)中,插入python -c 'import sys; print(sys.argv[1:])' 在要運行的命令之前python -c 'import sys; print(sys.argv[1:])'

19:59 ~ $ python -c 'import sys; print(sys.argv[1:])' xvfb-run --auto-servernum --server-args="-screen 0 640x480x24" --error-file=/dev/stdout /opt/myExecutable
['xvfb-run', '--auto-servernum', '--server-args=-screen 0 640x480x24', '--error-file=/dev/stdout', '/opt/myExecutable']

結果列表正是您應該傳遞給subprocess.run 在這里,我們可以看到shell將輸入中的--server-args="-screen 0 640x480x24"轉換為一個沒有引號的單個參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM