gpt4 book ai didi

python - 在子进程中使用包含双引号的变量

转载 作者:行者123 更新时间:2023-11-30 22:35:45 25 4
gpt4 key购买 nike

我在使用子进程模块时遇到了一些问题。我希望模块运行相当于 'ls -l "/path/to/file/with possible space in directory/or with space in name"' 的 shell 命令。当文件名不是变量时,子进程可以正常工作。如果文件名是包含引号的变量,则它不起作用。

无效的代码:

import subprocess

archive_file_list = "/var/tmp/list"
archive = open(archive_file_list, "r")

for line in archive:
noreturnline = line[:-1]
quotedline = "\"" + noreturnline + "\""
if extension == "zip":
print quotedline
archivelist = subprocess.check_output(['ls', '-l', quotedline])
print archivelist

有效的代码:

archivelist = subprocess.check_output(['ls', '-l', "/path/to/file/with possible space in directory/or with space in name"])

以下是不起作用的代码的输出:

"/path/to/file/with possible space in directory/or with space in name"
ls: cannot access "/path/to/file/with possible space in directory/or with space in name" No such file or directory
Traceback (most recent call last):
File "./archive_test.py", line 12, in <module>
archivelist = subprocess.check_output(['ls', '-l', quotedline])
File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['ls', '-l', '"/path/to/file/with possible space in directory/or with space in name"']' returned non-zero exit status 2

在你问之前 - 是的,我已经通过从命令行运行“ls -l”验证了“/path/to/file/目录中可能存在空间/或名称中存在空间”确实存在。

如有任何帮助,我们将不胜感激。提前致谢。

最佳答案

在第一个命令中(这是最好的选项):

archivelist = subprocess.check_output(['ls', '-l', "/path/to/file/with possible space in directory/or with space in name"])

第三个参数实际上是/path/to/file/目录中可能存在空格/或名称中存在空格(不带引号),这是存在的文件名,并且该命令有效。

由于 shell=True 甚至没有设置,命令直接传递给 exec,参数按原样传递:空格和其他字符被保留.

如果您添加更多引号,它们不会被删除,而是会按字面意思传递给 ls

由于没有名为“/path/to/file/with possible space in directory/or with space in name”的文件(带引号),因此找不到文件/dir。

还有另一种调用命令的(肮脏的)方式:将完整命令作为字符串(而不是参数列表)传递。在这种情况下,这是可行的(至少在 Windows 上没有 shell=Truesubprocess 似乎可以处理参数分割, shell=True 似乎类 Unix 系统上需要):

subprocess.check_output('ls -l "/path/to/file/with possible space in directory/or with space in name"')

但是您的第一种方法更干净,特别是如果您不知道目录名称,因为它是一个参数。让 subprocess 为您完成繁重的工作。

在类 Unix 系统上,使用最后一种方法需要 shell=True,但是这样您的程序就会遭受恶意攻击,例如任何开放系统调用(附加 ;rm -rf/ 到文件名,例如评估子 shell)

最后一点:如果您真的打算使用 ls 并解析其输出,请不要这样做( http://mywiki.wooledge.org/ParsingLs ),请使用标准 os.listdiros.path.getsize/getmtimeos.stat 调用来获取您需要的信息。

关于python - 在子进程中使用包含双引号的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com