2016-11-12 4 views
0

내가 subprocess.Popen을 사용하여 NOTEPAD.EXE()subprocess.Popen와 상대 디렉토리

import subprocess 
command = '%windir%\system32\\notepad.exe' 
process = subprocess.Popen(command) 
output = process.communicate() 
print(output[0]) 

이것은 FileNotFoundError

을 던져 그 위에 추가/변경할 수 있습니다를 열 수있는 스크립트를 쓰고 있어요 상대 경로와 함께 작동하도록하는 코드? C : \ Windows>에서 스크립트를 실행하려고 시도했지만 거기에서 다시 실패했습니다. 또한 shell = True로 설정했으나 실패했습니다. os.popen()을 사용하여 유사한 스크립트를 작성하는 것은 스크립트가 실행되는 디렉토리와 관계없이 상대 경로에서 정상적으로 작동하지만 popen은 앞으로의 방법이 아니라는 것을 이해합니다.

프로그래밍/파이썬. 어떤 의견이라도 대단히 감사합니다.

답변

0

사용 os.path.expandvars%windir%을 확장 :

command = os.path.expandvars('%windir%\\system32\\notepad.exe') 

결과는 다음 subprocess.Popen에 전달 될 수있는 경로입니다.

subprocess.Popen%windir%과 같은 환경 변수는 확장되지 않습니다. 셸 수도 있지만 실제로는 shell=True에 의존해서는 안됩니다.

1

Pro 팁 : 시스템에 명령을 실행하라는 오류가 나타나면 명령 (해당하는 경우 현재 작업 디렉터리)을 인쇄하십시오. 결과는 종종 당신을 놀라게합니다.

귀하의 경우에는 백 슬래시가 누락 된 것 같습니다. 대신를 사용

command = '%windir%\\system32\\notepad.exe' 

그 변경 전에 즉시 할당 후 command의 값을 인쇄 해보십시오. 나는 당신이 "시스템"의 선도적 인 "s"가 빠진 것을 발견 할 것이며, 실수가 명백하다는 것을 알게 될 것이라고 생각합니다.

HTH.

+0

팁 주셔서 감사합니다. 나는 system32 앞에 \ 또는 \와 함께 두 가지를 시험해 보았지만 인쇄물은 동일했다. – mdn

0

원시 문자열을 사용하여 백 슬래시를 이중화하지 않아도됩니다.

command = r'%windir%\system32\notepad.exe' 
+0

감사합니다. 그 팬더에서 사용 된 것과 같은 것이 있는지 알고 있습니까? DataFrame.index = DataFrame.index.str.replace (r '(string_to_replace', 'new_string')?) 정규 표현식을 부르짖 었다고 생각했지만 이제는 쓴 것처럼 원시 문자열을 나타냅니다. DataFrame.index.str.replace (r '(\ s \. * \)', 'new_string') 형식의 표현식이므로 혼동이 생깁니다. – mdn