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


273

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

작은 따옴표 / 큰 따옴표를 교체하십시오.

메모장에 매개 변수가 있거나없는 경우 오류 메시지와 함께 실패합니다

파일 이름, 디렉토리 이름 또는 볼륨 레이블 구문이 올바르지 않습니다.


이것을 사용하십시오 : os.system(r'C:\temp\"a b c"\Notepad.exe') 또는 이것 :os.system('C:\\temp\\"a b c"\\Notepad.exe')
chanzerre

차후 방문자의 경우 인수가있는 앱을 실행하려는 경우 (하위 프로세스 사용). 인수를 공백으로 나누고 각각을 개별적으로 전달해야합니다. 예를 들어, 이것은 bat 파일에서 온 것 "C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif"입니다. 파이썬에서는 다음과 같이됩니다 ["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"].
akinuri

답변:


297

subprocess.call다양한 쉘의 인용 규칙을 처리 해야하는 문제를 피할 수 있습니다. 문자열이 아닌 목록을 허용하므로 인수를보다 쉽게 ​​구분할 수 있습니다. 즉

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

81
Windows에서 원시 문자열을 사용하는 것이 훨씬 간단합니다. r "C : \ Temp \ abc \ Notepad.exe"
PierreBdR

1
예, os.exec * 함수는 현재 프로세스를 대체하므로 파이썬 프로세스는 계속되지 않습니다. 쉘이 명령을 실행하는 일반적인 방법이 자식에서 fork () 및 exec ()하는 유닉스에서 더 많이 사용됩니다.
Brian

1
이를위한 windows 방법은 os.spawn 패밀리이며 대신 사용할 수 있습니다. 하위 프로세스는 이식성이 뛰어나고 프로세스 제어 (입력 / 출력 캡처 등)에 더 많은 유연성을 제공하므로 선호됩니다.
Brian

6
@PierreBdr : 원시 문자열이 작동하지 않는 경우가 있습니다 : 슬래시가 필요합니다. 예 : r'c : \ foo \ bar \ '. 실제로 슬래시를 대신 사용하는 것이 좋습니다. 이것들은 Windows API 전체에서 받아 들여집니다 (항상 일부 쉘 명령 (예 : 복사)에 의해 발생하는 것은 아님)
Brian

1
파이썬> = 3.5 subprocess.call으로 대체되어야 subprocess.run docs.python.org/3/library/subprocess.html#older-high-level-api
gbonetti

67

다른 방법이 있습니다.

Windows를 사용하는 경우 다음은 탐색기에서 파일을 두 번 클릭하거나 파일 이름을 DOS "start"명령의 인수로 제공하는 것과 같은 역할을합니다. 확장명이 연결된 응용 프로그램 (있는 경우)으로 파일이 열립니다. .

filepath = 'textfile.txt'
import os
os.startfile(filepath)

예:

import os
os.startfile('textfile.txt')

메모장이 .txt 파일과 연결된 경우 메모장에서 textfile.txt가 열립니다.


1
* nix 시스템과 동등한 기능이 있습니까?
Romeno

@Romeno : 시도 할 수 있습니다 : webbrowser.open("textfile.txt")텍스트 편집기를 열어야합니다. "단지 두 번 클릭 한 것처럼 두 번째 프로그램을 완전히 시작
jfs

내 설정에서 textfile.txt는 따옴표로 묶어야합니다. 예 :os.startfile('path\to\textfile.txt')
thdoan

34

가장 바깥 쪽 따옴표는 Python 자체에 의해 소비되며 Windows 셸에는 표시되지 않습니다. 위에서 언급했듯이 Windows는 큰 따옴표 만 이해합니다. Python은 Windows에서 슬래시를 백 슬래시로 변환하므로 다음을 사용할 수 있습니다.

os.system('"C://Temp/a b c/Notepad.exe"')

'는 Python에 의해 소비 된 다음 "C : //Temp/abc/Notepad.exe"(Windows 경로로 이중 백 슬래시 필요 없음)를 CMD.EXE에 전달합니다.


1
이것은 os.system('curl URL > file')정말 큰 파일에 대한 cURL의 진행률 새로 고침을보고 싶은 시나리오에서 가장 좋습니다 .
Zach Young

백 슬래시 후 첫 글자 (즉 특별한 의미가있는 경우 \t, \n등)를 특정 백 슬래시는 두 배가되어야합니다. Windows 경로는 관련이 없습니다.
Ethan Furman

1
os.system()Windows에서 사용하는 경우 cmd 창이 열리고 시작된 프로세스를 닫을 때까지 열린 상태로 유지됩니다. IMHO를 사용하는 것이 좋습니다 os.startfile().
thdoan

1
잊지 마세요import os
Besi

나를 위해 작동하지 않습니다 stackoverflow.com/questions/56241616/…
Gulzar

19

적어도 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)

그거였다! 내가 가고 싶어 subprocess하지만, 때로는 os.systemos.popen(...).read()단지 빠르게 입력 할 수 있습니다. BTW, 작은 따옴표 안에 큰 따옴표를 피할 필요가 없습니다 '""C:\\Temp\\a b c\\Notepad.exe""'.
Tomasz Gandor

9
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

win32api.WinExec ( 'pythonw.exe d : \ web2py \ web2py.py -K welcome')은 백그라운드에서 web2py 스케줄러를 시작합니다.
Tim Richardson

@rahul 그리고 실행 파일에 대한 인수를 제외하고 있습니까? 메모장에서 파일을 열려면 별도입니까?
sayth


3

Windows에서 바로 가기를 사용할 때와 동일한 문제인 것 같습니다. 다음을 시도하십시오.

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

죄송합니다.이 문제를 반영하기 위해 편집 된 질문도 작동하지 않습니다.
Lasse V. Karlsen

Windows는 인용에 '가 아닌'만 사용합니다. 이것은 이것을 변경하면 효과가있을 것입니다. 그러나 따옴표 등을 포함하면 여전히 문제가 발생합니다.
Brian

둘 다 필요하다고 생각했지만 아마 옳을 것입니다. 나는 그것이 큰 따옴표로 (쉘 atleast에서) 작동한다는 것을 안다.
Matthew Scharley

+1 이것은 최고입니다. Windows XP, 2007 홈 에디션은 훌륭하게 작동했습니다

0

경로 (path = '/home/<you>/<first-path-section> <second-path-section>') 사이에 공간이 있다고 Django 웹 서버 (Linux)를 실행한다고 가정 하고 다음을 수행하십시오.

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 배설 가능하다 : chmod +x manage.py

0

Python 3.7의 경우 subprocess.call을 사용하십시오 . 원시 문자열을 사용하여 Windows 경로를 단순화하십시오.

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])

0

하위 프로세스가 필요하지 않습니다.

GitPath = "C : \ Program Files \ Git \ git-bash.exe"# mycase의 응용 프로그램 파일 경로 GITBASH os.startfile (GitPath)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.