(Python) Блокирующий подпроцесс

У меня есть класс сценария, который запрашивает из базы данных и отображает результат. проблема в том, что когда я добавляю подпроцесс ниже скрипта, скрипт зависает (или ждет и будет продолжаться, если завершится нажатием ctr-c)

например. Группа A будет запущена, если группа B будет удалена. Группа B будет запущена, если группа A будет удалена

#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()

person Led    schedule 23.10.2017    source источник
comment
что делает "cscript DoSomething.vbs" при запуске из консоли? он выходит?   -  person Jean-François Fabre    schedule 23.10.2017
comment
да выходит. это просто эхо   -  person Led    schedule 23.10.2017
comment
Сначала я бы попробовал p = subprocess.Popen(["cscript",'DoSomething.vbs"], stdout=subprocess.PIPE). Вам нужен вывод? вам нужно передать ввод?   -  person Jean-François Fabre    schedule 23.10.2017
comment
да, это работает, когда группа A удалена. мне не нужен вывод и мне не нужны никакие входы, мне просто нужно его выполнить.   -  person Led    schedule 23.10.2017
comment
conn.close, а не conn.close()? это наверное твоя проблема.   -  person Jean-François Fabre    schedule 23.10.2017
comment
да, это проблема, большое спасибо   -  person Led    schedule 23.10.2017


Ответы (1)


при запуске conn.close вы на самом деле не закрываете базу данных. Он ничего не делает, потому что вы не вызываете функцию.

Таким образом, следующий вызов остается заблокированным в ожидании доступа к базе данных.

Исправить:

conn.close()

обратите внимание, что правильный способ запуска вашего процесса после этого (поскольку вам не нужны ввод, вывод,...):

subprocess.check_call(["cscript","DoSomething.vbs"])

это просто потерпит неудачу, если cscript вернет ненулевой код возврата, что достаточно безопасно.

Обратите внимание, что интерфейс вашей базы данных, вероятно, поддерживает диспетчер контекста, в этом случае было бы лучше написать:

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

в этом случае соединение закрывается автоматически при выходе из блока with.

person Jean-François Fabre    schedule 23.10.2017