2012-04-30 4 views
0

경로을 일부 응용 프로그램과 함께 열려고합니다. 문제는 경로에 파일을 열지 못하게하는 다양한 제어 문자가 포함되어 있다는 것입니다. 다음 코드는 제어 문자 앞에 \ 접두사가 붙는 마지막 시도를 보여줍니다. 그러나 이상하게도 파일을 여러 번 엽니 다 (예 : 무한 루프). 제어 문자를 파이썬에서 쉘용 인수로 사용하는 경로

path = path.replace("'", "\\'") 
path = path.replace("(", "\\(") 
path = path.replace(")", "\\)") 
try: 
    os.system("%s %s 2>/dev/null &" % (appForExtension[extension], path)) 
except: 
    print "not opened" 

는 표준 적 os.system을() 호출 제어 문자와 함께 문제를 방지하여 파일을 여는 방법을 알고 계십니까?

+0

그것은 당신이 원시 문자열을 사용할 수 있습니다 지적 가치 ('R'\ ' "') 백 슬래시를 탈출 방지하기 위해 ... 독자에게 연습으로 남아 있습니다. –

답변

1

os.system을 사용하는 대신 subprocess 모듈을 사용할 수 있으며 셸을 통해 명령을 전달하지 않아도됩니다. 이것은 따옴표 나 다른 쉘 메타 문자를 빠져 나오는 것에 대해 걱정할 필요가 없다는 것을 의미하며 일반적으로 경로의 일부를 해석하는 쉘 (mis-)에 대해 걱정할 필요가 없습니다. subprocess.call에 대한

import subprocess 
res = subprocess.call([appForExtension[extension], path]) 

워드 프로세서 말 : 그 subprocess.call 기본적으로 쉘을 사용 방지를 제외하고 당신은 알게 될 것이다

subprocess.call = call(*popenargs, **kwargs) 
    Run command with arguments. Wait for command to complete, then 
    return the returncode attribute. 

이 ... os.system 현저하게 유사하다. stderr 리디렉션

+0

커맨드의 완료를 기다리고 싶지 않기 때문에 오스 * 시스템() *을 사용했습니다. * & *를 사용하는 이유는 무엇입니까? 그리고 오류 메시지를보고 싶지 않으므로 * 2를 사용합니다./dev/null/* – xralf

+0

...'subprocess' 모듈을 사용하여 동일한 작업을 수행 할 수 있습니다. 문서를 살펴보십시오. 나는 당신이 훨씬 더 유연해질 것이라고 생각합니다. – larsks

+0

표준 오류 출력을 리디렉션하기 위해 * stderr = "/ dev/null"* 인수를 추가 할 때 파일이 열리지 않으며 문서에서 백그라운드로 실행하는 것에 대해서는 아무 것도 볼 수 없습니다. 이 점에 확신이 있다면 올바른 주장을 고쳐주십시오. – xralf

관련 문제