외부 프로그램을 실행 해야하는 Python 스크립트가 있지만 어떤 이유로 실패합니다.
다음 스크립트가있는 경우 :
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
그런 다음 다음 오류와 함께 실패합니다.
‘C : \ Temp \ a’는 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다.
따옴표로 프로그램을 탈출하면 :
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
그런 다음 작동합니다. 그러나 매개 변수를 추가하면 다시 작동이 중지됩니다.
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
프로그램을 실행하고 완료 될 때까지 기다리는 올바른 방법은 무엇입니까? 작업을 수행 한 다음 종료하는 시각적 프로그램이므로 출력을 읽을 필요가 없지만 완료 될 때까지 기다려야합니다.
또한 프로그램을 간격이없는 경로로 옮기는 것도 옵션이 아닙니다.
이것은 작동하지 않습니다 :
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
작은 따옴표 / 큰 따옴표를 교체하십시오.
메모장에 매개 변수가 있거나없는 경우 오류 메시지와 함께 실패합니다
파일 이름, 디렉토리 이름 또는 볼륨 레이블 구문이 올바르지 않습니다.
답변
subprocess.call
다양한 쉘의 인용 규칙을 처리 해야하는 문제를 피할 수 있습니다. 문자열이 아닌 목록을 허용하므로 인수를보다 쉽게 구분할 수 있습니다. 즉
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
답변
다른 방법이 있습니다.
Windows를 사용하는 경우 다음은 탐색기에서 파일을 두 번 클릭하거나 파일 이름을 DOS “start”명령의 인수로 제공하는 것과 같은 역할을합니다. 확장명이 연결된 응용 프로그램 (있는 경우)으로 파일이 열립니다. .
filepath = 'textfile.txt'
import os
os.startfile(filepath)
예:
import os
os.startfile('textfile.txt')
메모장이 .txt 파일과 연결된 경우 메모장에서 textfile.txt가 열립니다.
답변
가장 바깥 쪽 따옴표는 Python 자체에 의해 소비되며 Windows 셸에는 표시되지 않습니다. 위에서 언급했듯이 Windows는 큰 따옴표 만 이해합니다. Python은 Windows에서 슬래시를 백 슬래시로 변환하므로 다음을 사용할 수 있습니다.
os.system('"C://Temp/a b c/Notepad.exe"')
‘는 Python에 의해 소비 된 다음 “C : //Temp/abc/Notepad.exe”(Windows 경로로 이중 백 슬래시 필요 없음)를 CMD.EXE에 전달합니다.
답변
적어도 Windows 7 및 Python 3.1 os.system
에서 Windows의 경우 명령 경로에 공백이 있으면 명령 줄을 큰 따옴표로 묶기를 원합니다 . 예를 들면 다음과 같습니다.
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
나를 놀라게 한 실제 예는 VirtualBox에서 드라이브를 복제하는 것입니다. subprocess.call
일부 액세스 권한 문제로 인해 위 의 솔루션이 작동하지 않았지만 명령을 큰 따옴표로 묶었을 때 os.system
행복해졌습니다.
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
답변
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
답변
파이썬의 경우> = 3.5 subprocess.run
대신에 사용해야합니다.subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
답변
Windows에서 바로 가기를 사용할 때와 동일한 문제인 것 같습니다. 다음을 시도하십시오.
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");