Python에서 프로그램을 어떻게 실행합니까? OS.System은 경로의 공간으로 인해 실패합니다
-
03-07-2019 - |
문제
외부 프로그램을 실행 해야하는 파이썬 스크립트가 있지만 어떤 이유로 든 실패합니다.
다음 스크립트가있는 경우 :
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를 사용하는 경우 다음은 Explorer에서 파일을 두 번 클릭하거나 파일 이름을 DOS "Start"명령에 대한 인수로 제공하는 것과 같은 작용을합니다. 파일은 어떤 응용 프로그램과 함께 파일이 열립니다. .
filepath = 'textfile.txt'
import os
os.startfile(filepath)
예시:
import os
os.startfile('textfile.txt')
메모장이 .txt 파일과 연관되어 있으면 메모장이있는 TextFile.txt를 열게됩니다.
가장 바깥 인용문은 파이썬 자체에 의해 소비되며 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
Windows에서 바로 가기를 사용할 때와 같은 문제라고 생각합니다 ... 이것을 시도하십시오.
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Python> = 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'])
경로 사이에 공간이 있음을 Django 웹 서버 (Linux에서) 실행하고 싶다고 가정 해 봅시다.'/home/<you>/<first-path-section> <second-path-section>'
), 다음도 마찬가지입니다.
import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[메모]:
- 허가 액세스를 잊지 마십시오 :
chmod 755 -R <'yor path'>
manage.py
exceable :chmod +x manage.py