Python에서 프로그램을 어떻게 실행합니까? OS.System은 경로의 공간으로 인해 실패합니다

StackOverflow https://stackoverflow.com/questions/204017

  •  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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top