【发布时间】:2018-04-23 23:44:19
【问题描述】:
我正在使用一个 python 脚本,它使用 subprocess 将命令传递给终端。我传递的部分命令涉及包含括号的路径。 Python 可以很好地处理带括号的字符串,但是终端当然不会在没有转义字符的情况下处理这些字符串。
我正在尝试通过将字符串输入子进程来将变量传递给命令行程序,但这里有一个重现错误的简单示例:
import subprocess
path = '/home/user/Desktop/directory(2018)'
command_str = 'rmdir ' + path
print (subprocess.run(command_str))
这给了我这个错误:
Traceback (most recent call last):
File "ex.py", line 7, in <module>
print (subprocess.run(command_str))
File "/usr/lib/python3.6/subprocess.py", line 403, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'rmdir /home/user/Desktop/directory(2018)': 'rmdir /home/user/Desktop/directory(2018)'
当我使用转义字符直接将其写入终端时,效果很好。
$ rmdir /home/user/Desktop/directory\(2018\)
但在 Python 中,当我尝试在调用子进程之前向字符串中添加转义字符时:
command_str = command_str.replace('(','\(')
command_str = command_str.replace(')','\)')
我得到与以前相同的错误,因为与print 不同,子进程字符串添加了第二个转义字符,该转义字符被传递到终端。
Traceback (most recent call last):
File "ex.py", line 7, in <module>
print (subprocess.run(command_str))
File "/usr/lib/python3.6/subprocess.py", line 403, in run
with Popen(*popenargs, **kwargs) as process:
File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'rmdir /home/user/Desktop/directory\\(2018\\)': 'rmdir /home/user/Desktop/directory\\(2018\\)'
有没有办法修复这个特定的错误?要么用replace 或subprocess.run 做一些不同的事情吗? (我不是在寻找更好的方法来删除目录。)谢谢。
【问题讨论】:
标签: python replace terminal subprocess escaping