如何从LinuxOS中的python脚本运行/停止c程序?

时间:2016-11-29 09:40:40

标签: python c++ gcc g++

我有一个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中停止应用程序,以便正确删除创建的对象。

3 个答案:

答案 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上的信号处理。