使用具有与 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 中的 & 一样的参数的子进程运行命令的主要内容,如果未能解决你的问题,请参考以下文章

ln&硬链接&软链接

相对路径和绝对路径的区别

python安装与使用(Windows)

VM虚拟机?

Windows Azure - Troubleshooting & Debugging: Role Recycling

Samba简介与配置(匿名&本地用户验证)