Windows 및 Mac OS 모두에서 Python의 기본 OS 응용 프로그램으로 문서 열기
Windows 및 Mac OS에서 기본 응용 프로그램을 사용하여 문서를 열 수 있어야 합니다.기본적으로 탐색기 또는 파인더에서 문서 아이콘을 두 번 클릭할 때 발생하는 것과 동일한 작업을 수행합니다.파이썬에서 이를 수행하는 가장 좋은 방법은 무엇입니까?
을 합니다.subprocess
2.4+가 아닌 파이썬 2할 수 있습니다.os.system()
그래서 당신은 껍질이 탈출하는 것을 다룰 필요가 없습니다.
import subprocess, os, platform
if platform.system() == 'Darwin': # macOS
subprocess.call(('open', filepath))
elif platform.system() == 'Windows': # Windows
os.startfile(filepath)
else: # linux variants
subprocess.call(('xdg-open', filepath))
이중 괄호는 다음과 같습니다.subprocess.call()
첫 번째 인수로 시퀀스를 원하기 때문에 여기서는 튜플을 사용합니다.에는 Gnome이라는 이름의 Linux도 .gnome-open
하지만 동한작수명는령행지만이하업을일▁that▁command만지.xdg-open
는 Free Desktop Foundation 표준이며 Linux 데스크톱 환경에서 작동합니다.
open
그리고.start
이를 위해 Mac OS/X와 Windows에 각각 명령 인터프리터 기능을 제공합니다.
하려면 Python 에서면다음중하나사수있용다습니할를호려출하▁▁use▁to를 하면 됩니다.subprocess
또는 모듈또os.system()
.
다음은 사용할 패키지에 대한 고려 사항입니다.
당신은 그들에게 전화할 수 있습니다.
os.system
효과가 있긴 하지만...탈출:
os.system
이름에 셸 예 경이 에공 예문없가파는일이름자기나타이타백메셸름로예:이▁only(:A:\abc\def\a.txt
),은 탈출해야 합니다.), 그지렇않탈출야합니켜다시들을이으.이 .shlex.quote
Unix와 유사한 시스템의 경우 Windows에 대한 표준 기능은 없습니다.python, windows: shlex를 사용한 명령줄 구문 분석을 참조하십시오.- MacOS/X:
os.system("open " + shlex.quote(filename))
- Windows:
os.system("start " + filename)
말하면.filename
또한 탈출해야 합니다.
- MacOS/X:
다음을 통해 전화할 수도 있습니다.
subprocess
모듈, 하지만...Python 2.7 이상의 경우 다음을 사용합니다.
subprocess.check_call(['open', filename])
Python 3.5+에서는 조금 더 복잡하지만 좀 더 다양한 기능을 사용할 수 있습니다.
subprocess.run(['open', filename], check=True)
2 Python 2.4를 할 수 .
subprocess.call()
자체 오류 검사를 구현합니다.try: retcode = subprocess.call("open " + filename, shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e
이제 사용의 이점은 무엇입니까?
subprocess
?- 보안:이론적으로는 이것이 더 안전하지만 실제로는 명령행을 어떤 식으로든 실행해야 합니다. 어느 환경에서든 해석하고 경로를 가져오는 등의 환경과 서비스가 필요합니다.두 경우 모두 임의 텍스트를 실행하지 않으므로 고유한 "하지만 입력할 수 있습니다.
'filename ; rm -rf /'
문제, 그리고 파일 이름이 손상될 수 있는 경우,subprocess.call
추가적인 보호를 거의 제공하지 않습니다. - 오류 처리:그것은 실제로 더 이상의 오류 감지를 제공하지 않습니다, 우리는 여전히 그것에 의존하고 있습니다.
retcode
두 경우 모두 오류가 발생할 경우 예외를 명시적으로 제기하는 동작은 오류가 발생한 경우를 인지하는 데 확실히 도움이 됩니다(일부 시나리오에서는 단순히 오류를 무시하는 것보다 추적이 더 유용하지 않을 수도 있음). - (비차단) 하위 프로세스를 생성합니다.문제 설명에 따라 별도의 프로세스를 시작하기 때문에 자식 프로세스를 기다릴 필요가 없습니다.
반의하에 "라는 반대 에.
subprocess
선호합니다."하지만,os.system()
사용되지 않으며, 어떤 의미에서 이 특정 작업을 위한 가장 간단한 도구입니다.하기: 사용하기:os.system()
따라서 정답이기도 합니다.현저한 단점은 Windows가
start
명령을 전달해야 합니다.shell=True
사용함으로써 얻을 수 있는 이점의 대부분이 사라집니다.subprocess
.- 보안:이론적으로는 이것이 더 안전하지만 실제로는 명령행을 어떤 식으로든 실행해야 합니다. 어느 환경에서든 해석하고 경로를 가져오는 등의 환경과 서비스가 필요합니다.두 경우 모두 임의 텍스트를 실행하지 않으므로 고유한 "하지만 입력할 수 있습니다.
선호하는 항목:
os.startfile(path, 'open')
이 모듈은 폴더 및 파일에 공백이 있는 파일 이름을 지원합니다.
A:\abc\folder with spaces\file with-spaces.txt
(docs) 'open'은 추가할 필요가 없습니다(기본값).문서에는 Windows 탐색기에서 파일 아이콘을 두 번 클릭하는 것과 같다고 명시되어 있습니다.
이 솔루션은 윈도우즈 전용입니다.
완전성을 위해 (문제에 포함되지 않은) xdg-open은 Linux에서도 동일한 작업을 수행할 것입니다.
import os
import subprocess
def click_on_file(filename):
'''Open document with default application in Python.'''
try:
os.startfile(filename)
except AttributeError:
subprocess.call(['open', filename])
휴리스틱 방법을 사용해야 하는 경우 다음을 고려할 수 있습니다.webbrowser
.
표준 라이브러리이며 이름에도 불구하고 파일을 열려고 합니다.
일부 플랫폼에서는 이 기능을 사용하여 파일 이름을 열려고 하면 운영 체제의 관련 프로그램이 작동하고 시작될 수 있습니다.그러나 이 기능은 지원되지 않으며 휴대할 수도 없습니다. (참고 자료)
이 코드를 사용해 봤는데 Windows 7과 Ubuntu Natty에서 잘 작동했습니다.
import webbrowser
webbrowser.open("path_to_file")
이 코드는 Internet Explorer 8을 사용하는 Windows XP Professional에서도 잘 작동합니다.
▁the▁go▁you▁to▁if▁want면다싶고만가.subprocess.call()
Windows에서는 다음과 같이 표시됩니다.
import subprocess
subprocess.call(('cmd', '/C', 'start', '', FILE_NAME))
다음을 사용할 수는 없습니다.
subprocess.call(('start', FILE_NAME))
start
실행 파일이 아니라 의 명령입니다.cmd.exe
기능은 다음과 같습니다.효과:
subprocess.call(('cmd', '/C', 'start', FILE_NAME))
그러나 FILE_NAME에 공백이 없는 경우에만 가능합니다.
하는 동안에subprocess.call
방법
엔 매개 변수를 적절하게 인용합니다.start
명령의 구문이 다소 이상합니다.
start notes.txt
다음 이외의 작업 수행:
start "notes.txt"
첫 번째 따옴표로 묶은 문자열은 창의 제목을 설정해야 합니다.공간과 함께 작동하려면 다음 작업을 수행해야 합니다.
start "" "my notes.txt"
위에 있는 코드가 하는 일입니다.
시작은 긴 경로 이름과 공백을 지원하지 않습니다.8.3 호환 경로로 변환해야 합니다.
import subprocess
import win32api
filename = "C:\\Documents and Settings\\user\\Desktop\file.avi"
filename_short = win32api.GetShortPathName(filename)
subprocess.Popen('start ' + filename_short, shell=True )
API 호출을 사용하려면 파일이 존재해야 합니다.
os.startfile(path, 'open')
윈도우에서는 디렉토리에 공백이 존재할 때,os.system('start', path_name)
수 앱제대로이 i18n에디때존,os.system
Windows에서 콘솔의 코덱으로 유니코드를 변경해야 합니다.
제가 많이 늦었지만, 여기 윈도우 API를 이용한 해결책이 있습니다.그러면 항상 연결된 응용프로그램이 열립니다.
import ctypes
shell32 = ctypes.windll.shell32
file = 'somedocument.doc'
shell32.ShellExecuteA(0,"open",file,0,0,5)
많은 마법 상수들.첫 번째 0은 현재 프로그램의 헌드입니다.0일 수 있습니다.다른 두 개의 0은 선택적 매개 변수(파라미터 및 디렉토리)입니다.5 == SW_SHOW, 앱 실행 방법을 지정합니다.자세한 내용은 ShellExecute API 문서를 참조하십시오.
다음은 WSL에 대해 약간 조정된 Nick의 답변입니다.
import os
import sys
import logging
import subprocess
def get_platform():
if sys.platform == 'linux':
try:
proc_version = open('/proc/version').read()
if 'Microsoft' in proc_version:
return 'wsl'
except:
pass
return sys.platform
def open_with_default_app(filename):
platform = get_platform()
if platform == 'darwin':
subprocess.call(('open', filename))
elif platform in ['win64', 'win32']:
os.startfile(filename.replace('/','\\'))
elif platform == 'wsl':
subprocess.call('cmd.exe /C start'.split() + [filename])
else: # linux variants
subprocess.call(('xdg-open', filename))
Mac OS X에서 파일을 열 앱을 지정하려면 다음을 사용합니다.os.system("open -a [app name] [file name]")
8와 같은 방식으로 8.1에서는 으로 작동했습니다.subprocess.call
경로에 공백이 있는 경우 실패합니다.
subprocess.call('cmd /c start "" "any file path with spaces"')
이전의 이것과 다른 사람들의 답변을 활용하여, 여기 여러 플랫폼에서 작동하는 인라인 코드가 있습니다.
import sys, os, subprocess
subprocess.call(('cmd /c start "" "'+ filepath +'"') if os.name is 'nt' else ('open' if sys.platform.startswith('darwin') else 'xdg-open', filepath))
에서는 Mausk라고 수 .open
:
import os
os.open("open myfile.txt")
이렇게 하면 TextEdit 또는 이 파일 형식에 대해 기본으로 설정된 앱이 있는 파일이 열립니다.
편집기에서 파일을 여는 것이 좋을 것 같습니다.
Windows의 경우
subprocess.Popen(["notepad", filename])
리눅스용
subprocess.Popen(["text-editor", filename])
크로스 플랫폼 지원을 위한 최상의 답변을 결합한 작은 라이브러리를 구축했습니다.
$ pip install universal-startfile
그런 다음 파일 또는 URL을 시작합니다.
from startfile import startfile
startfile("~/Downloads/example.png")
startfile("http://example.com")
열린 파일() 함수를 호출하는 동안 오류가 발생했습니다.제가 가이드를 따라가고 있었는데 Linux를 사용하는 동안 가이드가 창에 쓰여 있었습니다.그래서 os.statrfile 방법은 저에게 효과가 없었습니다.저는 다음을 수행함으로써 이 문제를 완화할 수 있었습니다.
라이브러리 가져오기
import sys, os, subprocess
import tkinter
import tkinter.filedioalog as fd
import tkinter.messagebox as mb
lib를 가져온 후에 저는 "xdg-open"인 unix 기반 OS에서 파일을 여는 하위 프로세스 방법과 열 파일을 불렀습니다.
def open_file():
file = fd.askopenfilename(title='Choose a file of any type', filetypes=[('All files', "*.*")])
subprocess.call(['xdg-open', file])
언급URL : https://stackoverflow.com/questions/434597/open-document-with-default-os-application-in-python-both-in-windows-and-mac-os
'source' 카테고리의 다른 글
추적되지 않은 다음 작업 트리 파일은 병합을 통해 덮어쓰지만 상관 없음 (0) | 2023.05.27 |
---|---|
VB.NET 디버그 오류: "현재 프로젝트 설정은 프로젝트를 디버그하도록 지정합니다.." (0) | 2023.05.27 |
iOS DeviceSupport 디렉토리에서 데이터를 삭제할 수 있습니까? (0) | 2023.05.27 |
등록된 IUserTokenProvider가 없습니다. (0) | 2023.05.27 |
https.request가 포함된 node.js의 잘못된 자체 서명 SSL 인증서를 무시하시겠습니까? (0) | 2023.05.27 |