[英]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,如我上面所述。
[編輯]
你們是寫的。 原來,我在完整代碼中保存了錯誤的key_to_write變量。 我有:
key_to_write = 'r"' + path + '"'
當我將其更改如下時,它工作正常:
key_to_write = r'"' + path + '"'
出於問題的考慮,我認為我已經正確定義了變量,因此我在縮短代碼的同時也縮短了代碼的編寫時間。 原來我一開始就錯誤地定義了它!
“ r”用於Python本身。 這意味着以下字符串是原始字符串。 它們在Windows上用於幫助Python了解包含空格的路徑等。 你可以在這里讀更多關於它的內容:
我不知道為什么它在Windows注冊表中。 Python不應該在乎其中的內容。
Windows使用\\
作為其路徑定界符。 Python使用\\
作為其字符串轉義字符。 顯然,這兩種用法有沖突。
帶有r
或R
前綴的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.