![](/img/trans.png)
[英]executing a tmux command normally containing '\;' using 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.