os.startfile(), Python 3.6을 사용하여 연 파일을 닫는 방법
os.startfile()을 사용하여 연 .txt, .csv, .xlsx와 같은 일부 파일을 닫으려고 합니다.
나는 이 질문이 앞에서 질문된 것을 알지만 이것에 대한 유용한 스크립트를 찾지 못했다.
나는 윈도우 10 환경을 사용한다
SO 포스트에 따르면, 열려 있는 파일을 닫을 방법이 없습니다. 비슷한 것들이 쿼라 포스트에서 논의됩니다.
그러나 Quora 게시물에서 제안한 것처럼 파일을 열기 위해 또는 와 같은 다른 도구를 사용하면 파일을 처리하는 데 더 큰 제어 권한을 부여할 수 있습니다.
당신이 데이터를 읽으려고 한다고 생각하기 때문에 파일을 수동으로 닫지 않으려는 당신의 의견에 대해서는 항상 예를 들어 설명을 사용할 수 있습니다.
with open('foo') as f:
foo = f.read()
약간 번거롭지만, 당신도 해야 하는 것처럼, 그것은 당신의 필요에 더 잘 맞을 수 있다.
나는 질문 문구가 약간 오해의 소지가 있다고 믿는다 - 실제로 당신은 당신이 여는 앱을 닫고 싶어한다
유감스럽게도 에서는 반환된 프로세스에 대한 핸들을 제공하지 않습니다.
startfile은 연결된 응용 프로그램이 시작되는 즉시 반환됩니다. 응용 프로그램이 닫힐 때까지 기다릴 수 있는 옵션도 없고 응용 프로그램의 종료 상태를 검색할 수 있는 방법도 없습니다.
다행히도 셸을 통해 파일을 여는 다른 방법이 있습니다:
shell_process = subprocess.Popen([file_name],shell=True)
print(shell_process.pid)
반환된 pid는 프로세스 자체가 아닌 상위 셸의 pid입니다. 그것을 죽이는 것은 충분하지 않을 것이다 - 그것은 단지 껍데기만 죽일 뿐, 아이들의 과정은 아닐 것이다. 우리는 아이에게 가야 한다:
parent = psutil.Process(shell_process.pid)
children = parent.children(recursive=True)
print(children)
child_pid = children[0].pid
print(child_pid)
닫을 pid입니다. 이제 프로세스를 종료할 수 있습니다:
os.kill(child_pid, signal.SIGTERM)
# or
subprocess.check_output("Taskkill /PID %d /F" % child_pid)
윈도우에서는 이것이 좀 더 복잡하다는 점에 유의하십시오. 이에 대한 추가 정보는 없습니다:
또한 나는 셸 프로세스 자체를 죽이려 할 때 받았다
os.kill(shell_process.pid, signal.SIGTERM)
나를 위해 어떤 과정이든 허가 오류 없이 일했다. 참조
아이들의 pid를 적절하게 얻기 위해, 당신은 사이클을 추가할 수 있다
import subprocess
import psutil
import os
import time
import signal
shell_process = subprocess.Popen([r'C:\Pt_Python\data\1.mp4'],shell=True)
parent = psutil.Process(shell_process.pid)
while(parent.children() == []):
continue
children = parent.children()
print(children)
응용 프로그램을 시작하는 데 도움이 되지만 실행된 응용 프로그램을 종료하거나 종료하거나 닫을 수 있는 옵션은 없습니다.
다른 대안은 다음과 같은 방식으로 하위 프로세스를 사용하는 것입니다:
import subprocess
import time
# File (a CAD in this case) and Program (desired CAD software in this case) # r: raw strings
file = r"F:\Pradnil Kamble\GetThisOpen.3dm"
prog = r"C:\Program Files\Rhino\Rhino.exe"
# Open file with desired program
OpenIt = subprocess.Popen([prog, file])
# keep it open for 30 seconds
time.sleep(30)
# close the file and the program
OpenIt.terminate()
나를 위해 일하다
나의 경우, 나는 Rainmeter.exe 파일과 경로를 당신의 것으로 바꾸기 위해 명령을 사용한다
이미 열려 있는 엑셀 파일의 경우, 어떤 메커니즘이든
# function to close a workbook given name
def close_wb(wbname):
import xlwings as xw
try:
app = xw.apps.active # get the active Excel application
print ('closing workbook',wbname)
# make workbook with given name active
wb = app.books[wbname]
wb.close()
except: pass
'개발하자' 카테고리의 다른 글
Python에서 문자열의 단위에서 숫자 구분 (0) | 2023.04.14 |
---|---|
글로벌 '예외'를 빠른 속도로 포착API (0) | 2023.04.13 |
키보드가 나타나면 이동 위젯의 크기가 조정됩니다. 어떻게 이것을 예방할 수 있을까요? (0) | 2023.03.23 |
Python에서 for 루프의 상위 결과 목록을 유지하는 방법 (0) | 2023.03.23 |
주피터 서버가 충돌했습니다. 연결할 수 없습니다. 주피터의 오류 코드: 1" (0) | 2023.03.22 |