Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python发送带有转义字符的子流程命令_Python_Replace_Terminal_Subprocess_Escaping - Fatal编程技术网

使用Python发送带有转义字符的子流程命令

使用Python发送带有转义字符的子流程命令,python,replace,terminal,subprocess,escaping,Python,Replace,Terminal,Subprocess,Escaping,我正在使用一个python脚本,它使用子进程将命令传递给终端。我传递的部分命令涉及包含括号的路径。Python可以很好地处理带括号的字符串,但当然,如果没有转义字符,terminal不会处理这些字符串 我试图通过向子流程中输入字符串将变量传递给命令行程序,但这里有一个简单的示例来重现错误: import subprocess path = '/home/user/Desktop/directory(2018)' command_str = 'rmdir ' + path print (sub

我正在使用一个python脚本,它使用子进程将命令传递给终端。我传递的部分命令涉及包含括号的路径。Python可以很好地处理带括号的字符串,但当然,如果没有转义字符,terminal不会处理这些字符串

我试图通过向子流程中输入字符串将变量传递给命令行程序,但这里有一个简单的示例来重现错误:

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)'
但在Python中,当我在调用子流程之前尝试向字符串添加转义字符时:

command_str = command_str.replace('(','\(')
command_str = command_str.replace(')','\)')
我得到了与之前相同的错误,因为与打印不同,子流程字符串添加了第二个转义字符,该字符被传递到终端

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\\)'
回溯(最近一次呼叫最后一次):
文件“ex.py”,第7行,在
打印(子进程运行(命令\u str))
文件“/usr/lib/python3.6/subprocess.py”,第403行,正在运行
使用Popen(*popenargs,**kwargs)作为流程:
文件“/usr/lib/python3.6/subprocess.py”,第709行,在__
恢复信号,启动新会话)
文件“/usr/lib/python3.6/subprocess.py”,第1344行,在执行子进程中
引发子项异常类型(错误号、错误消息、错误文件名)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“rmdir/home/user/Desktop/directory\\(2018\\):“rmdir/home/user/Desktop/directory\\(2018\\)”

有没有办法修复此特定错误?使用
替换
子流程执行不同的操作。运行
?(我不是在寻找更好的删除目录的方法。)谢谢。

不要使用子进程,也不必担心shell转义。使用stdlib中提供的高级文件操作API:


Python实现了
rm
rmdir
,因此无需调用进程。通常,如果要跳过
子进程
中命令的shell处理,请不要使用shell

import subprocess

path = '/home/user/Desktop/directory(2018)'
command =  ['rmdir', path]
print (subprocess.run(command, shell=False))

shell将命令行分解为参数列表。您可以自己构建该列表并完全跳过shell。

因此,我尝试使用一个脚本,其中包含一个更复杂的命令,该命令从终端运行
ffmpeg
。上述带有
rmdir
的代码是重现错误的示例。我将在问题中澄清这一点。谢谢构建参数列表并将shell设置为False修复了该问题!感谢tipThis仍然调用子进程(可能是
/bin/rmdir
),所以我认为说“Python实现了rm和rmdir”是误导。不值得投反对票,但我想值得一提。@wim-python实际上实现了
rm
(参见
os.remove
)和
rmdir
(参见
shutil.rmtree
)功能。您是否担心这些命令比python命令有更多的选项?问题是关于转义字符,这就是我回答的问题。我的观点是,你说你不需要调用进程,然后你展示调用进程的代码,它读起来不好/令人困惑。你不需要告诉我
shutil.rmtree
是Python
rmdir
,因为我在4小时前已经把它作为答案发布了……)我说过,
rm
命令不需要子进程,但通常这就是解决问题的方法。我想OP脑子里有更多的用例——这是一个玩具示例——我是对的。我觉得这一点也不令人困惑。“一般”意味着我指的是一个更普遍的解决方案。
import shutil
shutil.rmtree('/home/user/Desktop/directory(2018)')
import subprocess

path = '/home/user/Desktop/directory(2018)'
command =  ['rmdir', path]
print (subprocess.run(command, shell=False))