2014-04-25 2 views
0

하위 프로세스를 호출하는 python 스크립트를 실행하고 있습니다. 시간이 초과되면 즉시 하위 프로세스 (이 경우 BCP 호출)가 완료되는 것을 볼 수 있습니다. 실제로, 나는 그것이 데이터베이스에서 완전하다는 것을 알 수있다. 또한 BCP 명령을 명령 줄에서 직접 실행할 수 있으며 정상적으로 작동합니다.파이썬에서 BCP를 호출하면 시간 초과 예외가 발생하고 즉시 완료됩니다.

여기 내 파이썬 스크립트는 명령 프롬프트로 뱉어 무엇 : 당신이 볼 수 있듯이

C:\FaceIAPS\StudyDataFiles> py .\RUN_DATA.py 
Synchronizing 80 subjects 
Subject 11 

Starting copy... 
Traceback (most recent call last): 
    File ".\RUN_DATA.py", line 261, in <module> 
    bulk_import(upload_file, 'Facet_Data') 
    File ".\RUN_DATA.py", line 171, in bulk_import 
    subprocess.check_call("bcp BehaviorResearch.." + table_to_upload_to + " in " +  filename_to_be_uploaded + " -T -c -S 
PBB-C202B-2\BEHAVIORRESEARCH -e bulk_copy_errors.log", shell=True, timeout=5) 
    File "C:\Python34\lib\subprocess.py", line 554, in check_call 
    retcode = call(*popenargs, **kwargs) 
    File "C:\Python34\lib\subprocess.py", line 537, in call 
    return p.wait(timeout=timeout) 
    File "C:\Python34\lib\subprocess.py", line 1157, in wait 
    raise TimeoutExpired(self.args, timeout) 
subprocess.TimeoutExpired: Command 'bcp BehaviorResearch..Facet_Data in _temp_ -T -c -S  PBB-C202B-2\BEHAVIORRESEARCH -e 
bulk_copy_errors.log' timed out after 5 seconds 
1000 rows sent to SQL Server. Total sent: 1000 
1000 rows sent to SQL Server. Total sent: 2000 
PS C:\FaceIAPS\StudyDataFiles> 1000 rows sent to SQL Server. Total sent: 3000 
1000 rows sent to SQL Server. Total sent: 4000 
1000 rows sent to SQL Server. Total sent: 5000 
1000 rows sent to SQL Server. Total sent: 6000 
1000 rows sent to SQL Server. Total sent: 7000 
1000 rows sent to SQL Server. Total sent: 8000 
1000 rows sent to SQL Server. Total sent: 9000 
1000 rows sent to SQL Server. Total sent: 10000 
1000 rows sent to SQL Server. Total sent: 11000 
1000 rows sent to SQL Server. Total sent: 12000 
1000 rows sent to SQL Server. Total sent: 13000 
1000 rows sent to SQL Server. Total sent: 14000 
1000 rows sent to SQL Server. Total sent: 15000 
1000 rows sent to SQL Server. Total sent: 16000 

16102 rows copied. 
Network packet size (bytes): 4096 
Clock Time (ms.) Total  : 5164 Average : (3118.13 rows per sec.) 

는, 명령 프롬프트는 BCP 호출의 출력을 분할하고있다.
어떻게 될까요? 어떻게 수정합니까?

편집 : 나는 그것이

변경에 서브 프로세스 호출 고정 방법 "에서"참고 미숙에 대한로서

arguments = ["bcp", "BehaviorResearch.." + table_to_upload_to, "in", filename_to_be_uploaded, "-T", "-c", "-S PBB-C202B-2\BEHAVIORRESEARCH", "-e bulk_copy_errors.log"] 
subprocess.call(arguments, timeout=30) 

그것을 자신의 주장이다입니다. subprocess.check_call() say에 대한

+0

질문하는 것이 정확히 무엇입니까? – AHuman

답변

4

워드 프로세서 :

시간 초과 인수가 Popen.wait에 전달됩니다(). 시간 초과 이 만료되면 하위 프로세스가 종료되고 다시 대기합니다. 자식 프로세스 이 종료 된 후 TimeoutExpired 예외가 다시 발생합니다.

subprocess source code 그것을 확인 :

def call(*popenargs, timeout=None, **kwargs): 
    with Popen(*popenargs, **kwargs) as p: 
     try: 
      return p.wait(timeout=timeout) 
     except: 
      p.kill() # kill on any exception including TimeoutExpired 
      p.wait() 
      raise 

즉, 당신은 무엇을보고 무엇을 예상되는 동작입니다 : 제한 시간은 다음과 즉시 종료해야 BCP 프로세스를 실행하는 쉘 (%COMSPEC% 또는 cmd.exe)을 발생하는 경우 차례로 bcp 프로세스 자체가 종료 될 수 있습니다.

당신은 서브 프로세스가 이미 종료 후 버퍼 출력이 콘솔에 플러시되는 것을 볼 또는 (잘 모르겠어요) 부모 cmd.exe 이미 완성 된 (새로운 메시지가있는 동안 당신이 살아 손자 BCP 공정의 출력을 참조 표시).

불필요한 중간 단계 cmd.exe 프로세스를 만들지 않으려면 shell=True을 제거하여 .kill()이 셸 프로세스 대신 직접 bcp 프로세스에서 호출되도록합니다.

+0

이것은 옳다. 어떤 이유로 든 쉘에 문제가 있었지만 bcp는 훌륭하게 작동했습니다. 궁극적으로 쉘을 우회하려면 쉘 = True를 제거하지 않아야했습니다. 또한 각 인수를 목록에 전달하기 위해 호출을 다시 작성해야했습니다. –

관련 문제