Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)阻塞子进程_Python_Subprocess_Pyodbc - Fatal编程技术网

(Python)阻塞子进程

(Python)阻塞子进程,python,subprocess,pyodbc,Python,Subprocess,Pyodbc,我有一个脚本类,可以从数据库中查询并显示结果。问题是,当我在脚本下面添加子进程时,脚本挂起(或等待,如果使用ctr-c终止,脚本将继续) 如果删除B组,A组将运行。如果删除组A,则组B将运行 #Group A queryStrings = ['SELECT top 100 * FROM myDb', 'SELECT top 10 * FROM anotherDb'] ## class that connects to db and output the content ## db = Da

我有一个脚本类,可以从数据库中查询并显示结果。问题是,当我在脚本下面添加子进程时,脚本挂起(或等待,如果使用ctr-c终止,脚本将继续)

如果删除B组,A组将运行。如果删除组A,则组B将运行

#Group A
queryStrings = ['SELECT top 100 * FROM myDb', 
'SELECT top 10 * FROM anotherDb']

## class that connects to db and output the content ## 
db = Database
conn = db.connectToDb()

for query in queryStrings:
     db.runPreQueries(conn, query)

conn.close

##Group B 

if os.path.exists("DoSomething.vbs"):
    p = subprocess.Popen("cscript DoSomething.vbs", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
    stdout, stderr = p.communicate()

print("vbs completed")
我还尝试使用subprocess.call,然后终止它。这不会挂起,但不会执行脚本

p = subprocess.call("cscript DoSomething.vbs")
p.terminate()

运行
conn.close
时,您并不是真正关闭数据库。它什么也不做,因为您没有调用函数

因此,下一个呼叫将被阻止,等待数据库访问

修正:

请注意,之后运行流程的正确方法是(因为您不关心输入、输出等):

如果
cscript
返回一个足够安全的非零返回代码,则此操作将失败

请注意,您的数据库接口可能支持上下文管理器,在这种情况下,最好编写:

with db.connectToDb() as conn:    
    for query in queryStrings:
         db.runPreQueries(conn, query)

在这种情况下,当退出带有块的
时,连接会自动关闭。

从控制台运行时,
“cscript DoSomething.vbs”
是什么?它退出了吗?是的,它退出了。这只是一个简单的echoFirst,我会尝试
p=subprocess.Popen([“cscript”,“DoSomething.vbs]”,stdout=subprocess.PIPE)
。你需要输出吗?你需要传递输入吗?是的,当A组被删除时它会工作。我不需要输出,也不需要任何输入,我只需要执行它。
conn.close
,它不应该是
conn.close()
?这可能是你的问题。
subprocess.check_call(["cscript","DoSomething.vbs"])
with db.connectToDb() as conn:    
    for query in queryStrings:
         db.runPreQueries(conn, query)