如何在Python中安全地調用隨機文件上的類型? [英] How to call type safely on a random file in Python?
本文介紹了如何在Python中安全地調用隨機文件上的類型?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
因此,我嘗試對某個任意文件調用Windows命令類型。不幸的是,每當我將cmd從外殼命令轉換為非外殼命令時,都會失敗。因此,我不能使用推薦的方法來確保我的Python腳本不會被利用。這里有一個例子。
import subprocess
cmd = "type" + '"' + "some_file_with_no_spaces_or_other_things_wrong" + '"'
p = subprocess.pOpen(cmd, shell = True)
但當我嘗試時:
#Assume cmd split is done properly. Even when I manually put in the
#array with properly escaped quotes it does not work
subprocess.pOpen(cmd.split(), shell = False)
失敗了,我不知道如何解決這個問題。我希望能夠通過將外殼設置為FALSE來安全地調用此命令,但無論何時這樣做,我都會收到以下錯誤。
Traceback (most recent call last):
File "C:UsersSkyliongitLVDOWinBinOsiris.py", line 72, in openFileDialog
stderr = STDOUT, shell = False, bufsize = 0, universal_newlines=True)
File "C:Python34libsubprocess.py", line 859, in __init__
restore_signals, start_new_session)
File "C:Python34libsubprocess.py", line 1112, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] The system cannot find the file specified
請注意,即使運行:
subprocess.Popen(['type'])
將拋出錯誤。我的問題是如何清理文件名,以便可以運行帶有SHELL=True的文件名,或者使SHELL=FALSE正常工作。
如有任何有關如何以這種方式正確打開文件的幫助,我們將不勝感激。
推薦答案
type
是內部命令,因此您需要運行cmd.exe
,例如,隱式通過shell=True
運行。
subprocess.list2cmdline()
將列表轉換為字符串以傳遞給CreateProcess()
Windows API。其語法與cmd.exe
語法不同。詳情請參見read the links in this answer。
將外殼命令作為字符串傳遞并添加shell=True
:
from subprocess import check_call
check_call(r'type "C:pathwith spaces & special symbols.txt"', shell=True)
注意:r''
前綴用于避免轉義文字字符串中的后繼。
如果該命令在命令行中按原樣工作,則它也應該在Python中工作。
如果文件名是在變量中給定的,則可以使用^
將其轉義為外殼cmd
:
escaped_filename = filename_with_possible_shell_meta_chars.replace("", "^")[:-1]
check_call('type ' + escaped_filename, shell=True)
注意:沒有明確的引號。
顯然,您可以在純Python中模擬type
命令:
向控制臺設備(或其他位置)鍵入副本 如果重定向)。不檢查文件是否為可讀文本。
如果您只需要讀取文件;請使用open()
函數:
with open(r'C:pathwith spaces & special symbols.txt',
encoding=character_encoding) as file:
text = file.read()
如果不指定顯式編碼,則open()
使用'cp1252'
(locale.getpreferredencoding(False)
)等ANSI代碼頁將文件內容解碼為Unicode文本。
注意:您必須考慮此處的4個字符編碼:
- 文本文件本身的字符編碼。它可以是任何內容,例如
utf-8
- 圖形用戶界面應用程序使用的ANSI代碼頁,例如
cp1252
或cp1251
- cmd.exe使用的OEM代碼頁,例如
cp437
或cp866
。它們可用于type
命令重定向時的輸出 utf-16
由Unicode API使用,如WriteConsoleW()
,例如使用cmd /U
開關時。注意:Windows控制臺顯示的是UCS-2,即僅支持BMP Unicode字符,但復制-粘貼功能即使對于😊 (U+1F60A)這樣的星形字符也有效。
請參閱Keep your eye on the code page。
這篇關于如何在Python中安全地調用隨機文件上的類型?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文