使用具有与 Windows 中的 & 一样的参数的子进程运行命令
Posted
技术标签:
【中文标题】使用具有与 Windows 中的 & 一样的参数的子进程运行命令【英文标题】:Run a command with subprocess that has arguments as with & in Windows 【发布时间】:2020-04-14 14:10:48 【问题描述】:我正在尝试通过子进程运行接收作为参数文件的命令行命令。但是,这些文件可能包含“&”之类的字符,如果它们不在引号 (") 之间,则可以将其解释为 CMD 命令。
它通常有效,我在列表中传递的命令被破坏了。 示例:
from subprocess import run
file = r'broken&difficult.txt'
command = ['convert', file]
run(command)
但是它会返回一个 stdErr:
StdErr: 'diffcult.txt' is not recognized as an internal or external command, operable program or batch file
返回码是 1。
我已尝试将文件名变量更改为:
file =r'"broken&difficult.txt"'
结果是找不到任何文件。返回码为 0
【问题讨论】:
你能在txt文件中显示什么吗? 我在这里猜想,但你有没有尝试逃避它?\&
与 txt 文件中的内容无关。问题是名称中的 & 破坏了命令,命令行认为我正在传递一个新命令。我没有试图逃避它,但我会尝试。问题是来自一个更大的程序,用户将文件/文件夹传递给处理。我对命名没有太多控制权。
先试试不带&
的文件名,不带""
,确保没有路径问题...
【参考方案1】:
您需要在 & 符号之前使用 CMD 转义字符 - 胡萝卜 ^
。
试试:
import subprocess
file = 'broken^&difficult.txt'
command = ['convert', file]
subprocess.run(command, shell=True)
工作原理示例:
import subprocess
# create a file
with open('broken&difficult.txt', 'w') as fp:
fp.write('hello\nworld')
# use `more` to have OS read contents
subprocess.run(['more', 'broken^&difficult.txt'], shell=True)
# prints:
hello
world
# returns:
CompletedProcess(args=['more', 'broken^&difficult.txt'], returncode=0)
【讨论】:
两者都不喜欢。 StdErr: 'difficult.txt' 无法识别,并且 StdErr: & 此时出乎意料。 我省略了shell=True
部分以上是关于使用具有与 Windows 中的 & 一样的参数的子进程运行命令的主要内容,如果未能解决你的问题,请参考以下文章