簡體   English   中英

Python r前面帶引號的Windows注冊表項

[英]Python r Preceding Quoted Windows Registry Key

我想使用Python(2.7)檢查某個注冊表值是否存在,如果不存在則創建它。

我終於可以使用以下代碼使其工作:

from _winreg import *

key_to_write = r"C:\Python27\Python.exe"

exists = True
aReg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
try:
    aKey = OpenKey(aReg, r"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 0, KEY_WRITE)
except WindowsError:
    exists = False

try:
    if not exists:
        SetValueEx(aKey,'Python',0, REG_SZ, key_to_write) 
except EnvironmentError:                                          
    print "Encountered problems writing into the Registry..."

CloseKey(aKey)
CloseKey(aReg)

但是,在我實際的Windows注冊表中,“數據”值設置為(以r開頭):

r"C:\Python27\Python.exe"

我沒有在其他Windows注冊表數據值中看到此r之前的值,但是如上所述,我發現與Windows交互的每個Python實例都在該值之前帶有r,如我上面所述。

  1. 這是什么意思嗎?
  2. 我需要保持這個r嗎?
  3. 如上所示,r是否也應該出現在注冊表項中?

[編輯]

你們是寫的。 原來,我在完整代碼中保存了錯誤的key_to_write變量。 我有:

key_to_write = 'r"' + path + '"'

當我將其更改如下時,它工作正常:

key_to_write = r'"' + path + '"'

出於問題的考慮,我認為我已經正確定義了變量,因此我在縮短代碼的同時也縮短了代碼的編寫時間。 原來我一開始就錯誤地定義了它!

“ r”用於Python本身。 這意味着以下字符串是原始字符串。 它們在Windows上用於幫助Python了解包含空格的路徑等。 你可以在這里讀更多關於它的內容:

我不知道為什么它在Windows注冊表中。 Python不應該在乎其中的內容。

Windows使用\\作為其路徑定界符。 Python使用\\作為其字符串轉義字符。 顯然,這兩種用法有沖突。

帶有rR前綴的Python 原始字符串會阻止\\被解釋為轉義字符:

如果存在'r'或'R'前綴,則字符串中包含反斜杠后面的字符而不會更改,並且所有反斜杠都保留在字符串中。 例如,字符串文字r“ \\ n”由兩個字符組成:反斜杠和小寫字母'n'。 可以使用反斜杠對字符串引號進行轉義,但反斜杠仍保留在字符串中; 例如,r“ \\”“是由兩個字符組成的有效字符串文字:反斜杠和雙引號; r” \\“不是有效的字符串文字(即使原始字符串也不能以奇數個反斜杠結尾)。具體來說,原始字符串不能以單個反斜杠結尾(因為反斜杠會轉義以下引號字符),還要注意,單個反斜杠后跟換行符會被解釋為這兩個字符是字符串的一部分,而不是換行符。

在Windows上可用於路徑的代碼中遇到原始字符串的原因是,它允許包含Windows路徑分隔符的字符串使用\\而不是\\\\編寫。 因此,這使我們可以編寫:

r"C:\Python27\Python.exe"

而不是

"C:\\Python27\\Python.exe"

人們可能會認為原始字符串對讀者來說更清楚。 讀者至少了解一次原始字符串。


我不明白您對寫入注冊表的數據中出現的r前綴的含義。 問題中的代碼不會發生這種情況。

>>> print r"C:\Python27\Python.exe"
C:\Python27\Python.exe
>>> print "C:\\Python27\\Python.exe"
C:\Python27\Python.exe
>>> r"C:\Python27\Python.exe" == "C:\\Python27\\Python.exe"
True

我的猜測是您已經使用regedit手動添加了數據,這使您感到困惑。 還要注意注冊表重定向器。 如果使用32位Python,則您的代碼將修改32位注冊表視圖,通常存儲在HKLM\\Software\\Wow6432Node

暫無
暫無

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

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