簡體   English   中英

使用Python發送帶有轉義字符的子流程命令

[英]using Python to send subprocess commands with escape characters

我正在使用python腳本,該腳本使用子流程將命令傳遞給終端。 我要傳遞的部分命令涉及包含括號的路徑。 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\\)'

有沒有辦法解決此特定錯誤? 通過與replacesubprocess.run進行不同的操作? (我不是在尋找刪除目錄的更好方法。)謝謝。

不要使用子進程,也不必擔心外殼轉義。 使用stdlib的shutil提供的高級文件操作API:

import shutil
shutil.rmtree('/home/user/Desktop/directory(2018)')

Python實現rmrmdir因此無需調用進程。 在一般情況下,如果你想跳過在命令shell處理subprocess ,不使用shell。

import subprocess

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

Shell將命令行分成參數列表。 您可以自己構建該列表,然后完全跳過外殼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM