2009-08-13 4 views
0

이에 대한 시작 명령을 사용하여 시나리오입니다. 그 후이 파일을 읽고 다음 삭제를 시도합니다 batch.bat에서일괄 출력 리디렉션 GUI 응용 프로그램

os.system(C:\batch.bat >C:\temp.txt 2>&1) 
os.remove(C:\temp.txt) 

우리는이 같은 윈도우 GUI을 programm를 시작

start c:\the_programm.exe 

그게 모든 배치 파일에.

이제 temp.txt가 시스템에 여전히 잠겨 있기 때문에 os.remove()가 "Permission denied"로 실패합니다. 이것은 여전히 ​​실행중인 the_programm.exe (모든 출력이 temp.txt로 리다이렉트 된 것 같습니다)로 인한 것 같습니다.

아직 실행 중일 때 temp.txt를 잠그지 않고 the_programm.exe를 시작하는 방법에 대한 아이디어가 있으십니까? 파이썬 부분은 도구이기 때문에 거의 바꿀 수 없습니다 (BusyB).

실제로 the_programm.exe의 출력이 필요하지 않으므로 질문의 본질은 다음과 같습니다. the_programm.exe의 출력을 위해 temp.txt를 잠그지 않게하려면 어떻게해야합니까? 또는 일괄 출력 리디렉션을 상속하지 않고 프로그램을 시작하려면 START 또는 다른 Windows 명령을 어떻게 사용합니까?

+0

프로그램을 시작하고 출력 스트림에서 직접 읽으면 쉽지 않을까요? – Joey

답변

0

마지막으로 나는 적절한 해결책을 찾을 수 .exe 프로세스! 그게 다야!

+0

니스! 나는 fclose (stdin)를 사용하는 C 프로그램을 제안하려고했다. fclose (stdout); 그것은 기본적으로 같은 것입니다. –

0

Windows에서 열린 파일을 삭제할 수 있다고 생각하지 않습니다. 당신이 프로그램의 출력을 버리고 싶어하는 것처럼 들립니다. 대신에 'nul'로 리디렉션하면 필요한 것을 처리 할 수 ​​있습니까? 내가 알고있는 것처럼

+0

열려있는 파일을 삭제할 수 있습니다. 이 파일을 여는 방법에 달려 있습니다 (cf. CreateFile 문서 참조). – Joey

0

,이 문제이며, 그는 어떻게 원하는 것을 :

  1. 는 파이썬 코드에 변경하지 않습니다.
  2. 파이썬 코드는 "TEMP.TXT"가 더 이상 사용된다고 가정적인 서면 때이 함수가 반환 :

    os.system을 (C : \ batch.bat> C : \ TEMP.TXT 2> & 1)

  3. "batch.bat"는 "start"명령을 사용하여 대화식 GUI 프로그램을 생성하기 때문에 실제로는 그렇지 않습니다.

어떻게 "batch.bat"파일을 포함하도록 변경에 대한 : 해당 창에 키를 누르 때까지

start c:\the_programm.exe 
pause 

이 실행 "batch.bat"파일을 유지합니다. 일단 키를 치면, "os.system"python 명령이 돌아올 것이고, 그러면 파이썬은 "os.remove"를 호출 할 것입니다.

+0

문제를 올바르게 이해 했겠지만 일시 중지는 내가하고 싶지 않은 부분입니다. Python 스크립트는 the_program.exe를 계속 실행해야합니다. – desolat

+0

자동화에 사용되므로 사용자 상호 작용이 허용되지 않습니다. – desolat

+0

@desolat : 죄송합니다. Linux에서 무엇을 할 것인지 알고 있습니다. (새 프로세스를 포크하고 부모 - 자식 관계를 자르기) Windows에서 어떻게 할 것인지 잘 모릅니다. 바라건대 다른 사람이 잘하면. – Greg

0

파일을 읽은 다음 닫으시겠습니까? 끝 부분에서 다음 작업을 수행합니다.

import os 

os.system('runbat.bat > runbat.log 2>&1') 
f = open('runbat.log') 
print f.read() 
f.close() 
os.remove('runbat.log') 

f.close() 행을 제거하면 오류가 발생하지만 실패합니다.

+0

당신은 시작하고 여전히 실행중인 것을 놓쳤습니다.배치 파일에 exe. – desolat

0

파일을 바로 삭제하는 이유는 무엇입니까?

어떻게 이것에 대해 :

os.system(C:\batch.bat >nul 2>&1) 

편집 : 죄송합니다, 나는 파일을 읽는에 대한 의견을 놓친 난 단지 코드를 발견했습니다.

2

이것은 약간 해키지만 시도해 볼 수 있습니다. AT 명령을 사용하여 나중에 최대 the_programm.exe을 실행합니다 (이 값은 %TIME% 환경 변수와 SET 산술을 사용하여 계산됩니다).

batch.bat :

@echo off 
setlocal 
:: store the current time so it does not change while parsing 
set t=%time% 
:: parse hour, minute, second 
set h=%t:~0,2% 
set m=%t:~3,2% 
set s=%t:~6,2% 
:: reduce strings to simple integers 
if "%h:~0,1%"==" " set h=%h:~1% 
if "%m:~0,1%"=="0" set m=%m:~1% 
if "%s:~0,1%"=="0" set s=%s:~1% 
:: choose number of seconds in the future; granularity for AT is one 
:: minute, plus we need a few extra seconds for this script to run 
set x=70 
:: calculate hour and minute to run the program 
set /a x=s + x 
set /a s="x %% 60" 
set /a x=m + x/60 
set /a m="x %% 60" 
set /a h=h + x/60 
set /a h="h %% 24" 
:: schedule the program to run 
at %h%:%m% c:\the_programm.exe 

당신은 이들 각각이 무엇을하는지 볼 수 AT /?SET /? 상기 볼 수 있습니다. "사용자 상호 작용은 허용되지 않습니다."라고 말한 이후 /interactive 매개 변수는 AT입니다.

주의 사항은 :

  • %TIME%에 관계없이 제어판에서 로케일 설정, 항상 24 시간 것 같습니다,하지만 난이의 증거가 없습니다.
  • 시스템이로드되고 batch.bat가 실행되는 데 10 초 이상 걸리면 AT 명령이 1 일 후에 실행되도록 예약됩니다. AT {job} /delete을 사용하여 수동으로 복구 할 수 있으며 x=70을 더 수용 할만한 수준으로 늘리십시오. 현재 환경을 무시 /i 주어 졌을 때

START 명령은, 불행하게도, 심지어 부모 cmd.exe 프로세스의 파일 기술자를 전달할 것으로 보인다. 이러한 파일 디스크립터는 서브 프로세스가 NUL로 방향 재 지정 되더라도 서브 프로세스로 전달되는 것처럼 보이며 중간 쉘 프로세스가 종료 되더라도 열린 상태로 유지됩니다. START 다른 꾸러미 파일 START 다른 꾸러미 파일 (etc.) START GUI 윈도우 어플 리케이션 인 배치 파일이 있으면 이것을 Process Explorer에서 볼 수 있습니다. 중간 배치 파일이 종료되면 GUI 응용 프로그램은 파일 핸들을 소유하게됩니다. 중간 배치 파일은 모두 NUL으로 리디렉션됩니다. 파일에서 처리

from subprocess import Popen 

    if __name__ == '__main__': 
      Popen('C:/the_programm.exe', close_fds=True) 

close_fds 매개 변수는 디커플링 : 나는 the_programm.exe을 시작하기 위해 더 이상 배치 파일을 사용하고 있지 않다

하지만, 파이썬 스크립트를

+0

좋은 답변입니다! .exe를 시작하기 위해 배치 파일 대신 WSH 스크립트를 사용하면 어떤 도움이 될지 알고 싶습니다. – desolat

+0

나는 WSH/PowerShell/등을 걸 겠어. 이 작업을 수행하는 더 좋은 방법이있을 수 있습니다 (아마도 실제 '포크 (fork)'라고도 함). 그러나 나는 그것들에 익숙하지 않습니다. 내가 배치 파일을 수십 년 동안 사용해 왔기 때문에 나는 CMD를 따라 잡는다. –

+0

귀하의 스크립트를 시도했지만 작동시키지 못했습니다. Taskplaner 서비스가 System 계정으로 실행되기 때문에 나는 어떻게 든 프로그램 창을 얻지 못합니다. 내 계정으로 서비스 변경이 작동하지 않았습니다. 그러나 찾을 수있는 해결책에 대한 내 대답을보십시오. – desolat