我有一个c程序基本上是在无限While
循环中运行,如下所示。
int main(int argc, char** argv )
{
Detectdirection *d;
//Mosquitto
io_service io;
deadline_timer t(io);
MosquitoInterface *m = new MosquitoInterface(t);
d = new Detectdirection();
while(true)
{
int ret = d->Tracking();
if(ret < 0)
cout << "Pattern is not found" << endl ;
}
delete d;
delete m;
cout << "Exit" << endl;
return 0;
}
我喜欢从python脚本运行并停止程序。 运行程序非常简单。只是按照here所述提供构建文件的路径。
但是如何从Pyhton中停止应用程序,以便正确删除创建的对象。
答案 0 :(得分:5)
您需要在流程之间进行沟通。
向进程发送信号(并在可执行文件中捕获该信号)是执行此操作的常用方法。
从python发送信号:How to terminate a python subprocess launched with shell=True
处理信号: Signal Handling in C
或者,您可以使用更高级的技术发送消息(例如zeromq Understanding ZeroMQ,dbus https://stackoverflow.com/questions/tagged/dbus或COM COM, COM+, DCOM, where to start?)
这里的关键字是进程间通信。它有自己的维基百科文章https://en.wikipedia.org/wiki/Inter-process_communication
答案 1 :(得分:0)
您可以使用函数os.system()执行shell scripe。所以我支持使用如下代码,它向C进程发送一个kill信号(C进程的名称是'name':
def processinfo(x):
p = psutil.get_process_list()
for r in p:
aa = str(r)
f = re.compile(x,re.I)
if f.search(aa):
return aa.split('pid=')
os.system('kill -9 ' + processinfo(name))
答案 2 :(得分:0)
使用python&#39; DECLARE @sql VARCHAR(MAX)
SET @sql = '
DECLARE @i NVARCHAR(10)
SET @i = 'POL'
SELECT
a.something1,
b.something2,
c.something3
FROM
aaa a WITH(NOLOCK)
LEFT JOIN bbb b WITH(NOLOCK) ON....
LEFT JOIN ccc c WITH(NOLOCK) ON....
WHERE
a.somethingelse = ''aa''
AND
((a.entirelysomethingelse=''aaa'') OR (a.entirelysomethingelse=''aaaa''))
AND
b.anotherdifferentsomething != 41
AND
c.yetanotherdifferentthing LIKE(''%@%'')
AND
c.datafromvariablewannabe = (@i)
GROUP BY
...
ORDER BY
...'
EXECUTE (@SQL)
而不是便捷函数subprocess.Popen
启动程序。 call
对象具有Popen
方法,该方法向程序发送信号,该方法将以受控方式停止程序。程序在终止时的行为如何取决于C程序而不是python。如果.terminate()
使用SIGTERM
注册回调,则signal()
可以被您的程序捕获和处理。
我建议你写一些测试程序,如有必要,请阅读C和Windows上的信号处理。