如何在Python中安全地調用隨機文件上的類型? [英] How to call type safely on a random file in Python?

查看:0
本文介紹了如何在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運行。

如果在Windows上將命令作為列表傳遞,則將調用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個字符編碼:

  1. 文本文件本身的字符編碼。它可以是任何內容,例如utf-8
  2. 圖形用戶界面應用程序使用的ANSI代碼頁,例如cp1252cp1251
  3. cmd.exe使用的OEM代碼頁,例如cp437cp866。它們可用于type命令重定向時的輸出
  4. utf-16由Unicode API使用,如WriteConsoleW(),例如使用cmd /U開關時。注意:Windows控制臺顯示的是UCS-2,即僅支持BMP Unicode字符,但復制-粘貼功能即使對于😊 (U+1F60A)這樣的星形字符也有效。

請參閱Keep your eye on the code page。

要將Unicode打印到Windows控制臺,請參閱

這篇關于如何在Python中安全地調用隨機文件上的類型?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放