파이썬에서 프로그램을 어떻게 실행합니까? 경로의 공백으로 인해 os.system이 실패 함 다음 다음 오류와

외부 프로그램을 실행 해야하는 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");