2014-09-08 4 views
0

Python (2.7)을 사용하여 특정 레지스트리 값이 존재하는지 확인하고, 작성하지 않았 으면합니다.Python r 인용구가있는 Windows 레지스트리 키 앞에

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 포함)로 설정 :

는 드디어 this code를 사용하여 작동하도록 얻을 수 있었다

r"C:\Python27\Python.exe" 

다른 Windows 레지스트리 데이터 값에는 앞의 r이 표시되지 않지만 위의 예에서 발견 한 Windows를 처리하는 모든 Python 인스턴스는이 값 앞에 r이 붙습니다.

  1. 이 r은 의미가 있습니까?
  2. 이걸 보관해야합니까?
  3. 위와 같이 레지스트리 항목에도 r이 표시됩니까?

[편집]

너희들 쓰기이었다. 내 전체 코드에서 잘못된 key_to_write 변수를 저장 한 것으로 나타났습니다. 다음과 같이 내가 그것을 변경하는 경우

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

그것은 잘 작동 : 내가 한 질문을 위해서

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

가, 내가 제대로 변수를 정의했다고 생각, 그래서 나는 많은 내 코드를 단축 그 점을 염두에두고 코딩합니다. 내가 처음에 잘못 정의 했어!

답변

1

Windows는 경로 구분 기호로 \을 사용합니다. 파이썬은 문자열 이스케이프 문자로 \을 사용합니다. 분명히이 둘은 충돌을 사용합니다.

에 'R'또는 'R'프리픽스의 존재는 백 슬래시 다음 문자가 포함되어

파이썬 raw stringr 또는 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을 사용하는 경우 코드는 일반적으로 HKLM\Software\Wow6432Node 아래에 저장된 32 비트 레지스트리보기를 수정합니다.

+0

감사합니다. 그러나 여전히 레지스트리에 쓰여진 데이터에'r' 접두어가 왜 나타나는지 잘 모르겠습니다. – TechDude

+1

Q 코드는 그렇게하지 않습니다. 나는 당신이 우연히 수동으로했을 것이라고 생각합니다. –

+0

네, 맞습니다. 이에 따라 내 질문을 업데이트했습니다. – TechDude

1

"r"은 파이썬 자체를위한 것입니다. 다음 문자열이 원시 문자열임을 의미합니다. 이 파일은 Windows에서 사용되어 파이썬이 공백이 포함 된 경로를 이해하는 데 도움이됩니다. 당신은 여기에 대한 자세한 내용을보실 수 있습니다 :

는하지만 Windows 레지스트리에 정확히 이유를 모르겠어요. 파이썬은 그 안에 무엇이 있는지 신경 쓰지 않아야합니다.

+0

감사합니다. 나는 실수로'r'이 Windows 레지스트리와 관련된 것으로 생각한다고 생각했습니다. – TechDude

+0

내'key_to_write' 변수를 잘못 정의했습니다. 이에 따라 내 질문을 업데이트했습니다. – TechDude

관련 문제