从python调用BCP会引发超时异常,然后立即完成

从python调用BCP会引发超时异常,然后立即完成,python,subprocess,command-prompt,bcp,python-3.4,Python,Subprocess,Command Prompt,Bcp,Python 3.4,我正在运行一个调用子进程的python脚本。它超时,然后我立即看到子进程(在本例中是BCP调用)完成。事实上,我可以在数据库中看到它是完整的。此外,我可以直接在命令行上运行BCP命令,它工作得很好 下面是我的python脚本向命令提示符显示的内容: C:\FaceIAPS\StudyDataFiles> py .\RUN_DATA.py Synchronizing 80 subjects Subject 11 Starting copy... Traceback (most recent

我正在运行一个调用子进程的python脚本。它超时,然后我立即看到子进程(在本例中是BCP调用)完成。事实上,我可以在数据库中看到它是完整的。此外,我可以直接在命令行上运行BCP命令,它工作得很好

下面是我的python脚本向命令提示符显示的内容:

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.)
作为未入行人士的参考,“in”是它自己的论点。

以下文件:

超时参数被传递给Popen.wait()。如果超时 过期时,子进程将被终止,然后再次等待。 TimeoutExpired异常将在子进程之后重新引发 已经终止

委员会确认:

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
i、 例如,您看到的是预期的行为:如果发生超时,则运行bcp进程的shell(
%COMSPEC%
cmd.exe
)应立即终止,从而可能终止bcp进程本身

在子进程已经退出后,您会在控制台中看到缓冲输出被刷新,或者(我不确定)您会看到活动孙子bcp进程的输出,而其父进程
cmd.exe
已经完成(显示新的提示)

删除
shell=True
以避免创建不必要的中间
cmd.exe
进程,从而直接在bcp进程上而不是在shell进程上调用
.kill()

以下文档:

超时参数被传递给Popen.wait()。如果超时 过期时,子进程将被终止,然后再次等待。 TimeoutExpired异常将在子进程之后重新引发 已经终止

委员会确认:

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
i、 例如,您看到的是预期的行为:如果发生超时,则运行bcp进程的shell(
%COMSPEC%
cmd.exe
)应立即终止,从而可能终止bcp进程本身

在子进程已经退出后,您会在控制台中看到缓冲输出被刷新,或者(我不确定)您会看到活动孙子bcp进程的输出,而其父进程
cmd.exe
已经完成(显示新的提示)


删除
shell=True
以避免创建不必要的中间
cmd.exe
进程,从而直接在bcp进程而不是shell进程上调用
.kill()

您到底问了什么问题?您到底问了什么问题?这是正确的。不管出于什么原因,壳牌公司出现了问题,但bcp运作良好。最终,要绕过shell,我不仅要删除shell=True。我还必须重新编写调用以在列表中传递每个参数。这是正确的。不管出于什么原因,壳牌公司出现了问题,但bcp运作良好。最终,要绕过shell,我不仅要删除shell=True。我还必须重新编写调用以在列表中传递每个参数。