2016-11-29 3 views
1

현재 Popen을보고 있습니다. & 문서의 저장을 자동화하고 있습니다. 압축의 경우 subprocess.Popen (shell = True) with windows folders

, 나는 다음과 같은 파이썬 라인의 생각 :

subprocess.Popen("WinRAR.exe a -r c:\\03. Notes\\AllTexts *.txt", shell=True) 

명령이 공간 (03. Notes)를 포함하는 폴더 이름을 처리 할 수 ​​없습니다 나는이 오류 메시지를 가지고 유지. 이 질문은 몇 번하기 전에 물어 보았습니다. 원시 문자열, 큰 따옴표, 삼중 따옴표 등 모든 제안을 시도했다고 말해야합니다. 아무도 일하지 않았습니다.

폴더 이름을 변경할 수 없기 때문에 시도 할 아이디어가 더 이상 없으므로이 명령 줄을 성공적으로 통과시킬 수있는 방법을 조언 해줄 수 있습니까?

+0

왜 당신이 사용하는 '쉬 ell = True'입니까? 'glob' 모듈로 glob를 확장하는'list' 기반의 호출을 사용하고,'shell = True'를 사용하지 않고 파이썬이 필요한 변환을하거나 자동으로 이스케이프하도록 할 수 있습니까? – ShadowRanger

+0

이 명령에 쉘을 사용할 이유가 없습니다. 셸없이 인수 목록을 사용하십시오 (예 : 'subprocess.check_call (""WinRAR.exe ","a ","-r ", r"C : \ 03. Notes \ AllTexts ","* .txt "])'. – eryksun

+0

이 힌트를 가져 주셔서 감사합니다. 인수 목록은 필자의 예제보다 훨씬 길기 때문에 check_call은 많은 의미를가집니다. 나는 당신의 코멘트를 표시하는 방법이 귀중한 대답을 가지고 있는지 모르지만 실제로 많은 도움이되었습니다. 자동화 프로젝트에서 희망을 되찾았습니다 :-) – JCF

답변

1

Windows에서 공백을 사용하려면 파일 또는 디렉토리 이름에 따옴표를 사용해야합니다. . (따옴표 "내부 문자열을 사용하는 경우) 파이썬에서,이 같이 \ 기호 따옴표를 탈출해야합니다

"my name is \"Mark\"!" 

또는 단지 :

'my name is "Mark"!' 

그래서이 예상대로 작동됩니다 :

뿐만 아니라

subprocess.Popen("WinRAR.exe a -r \"c:\\03. Notes\\AllTexts\" *.txt", shell=True) 
:

subprocess.Popen('WinRAR.exe a -r "c:\\03. Notes\\AllTexts" *.txt', shell=True) 
+0

문자열 내에서 원시 문자열을 사용하는 것이 저에게 새로운 것입니다. 코드를 수정했는데 잘 돌아갔습니다. 힌트를 가져 주셔서 감사합니다. 위의 eryksun에서 언급 한 check_call 메소드도 시도했다. 지금은 2 가지 방법을 비교 중입니다. check_call은 백 슬래시 계산의 관점에서 읽기 쉽고 덜 위험합니다. 어쨌든, 나는 "더 이상 테스트 할 생각이 없다"에서 "비교할 2 가지 옵션"으로 6 시간 만에 이동했습니다. 고마워. – JCF