【问题标题】:c++ "system" call doesn't doesn't return the proper exit codec ++“系统”调用不返回正确的退出代码
【发布时间】:2013-01-15 18:18:03
【问题描述】:

我有以下 C++ 代码

...
int res = system("python myscript.py");
if(res != 0){
    cerr << "Exit code was:" << res << endl;
}

python脚本文件以

结尾
print "This will exit with code 0"
sys.exit(0)

如果我直接运行 python 脚本,我会得到正确的退出代码 (0)。但是,如果我通过 c++ 应用程序运行它,res 为 -1,即使正确打印了“This will exit with code 0”行。

奇怪的是,如果我将调用移到 C++ 应用程序执行的开头,则系统调用 python 返回的退出代码是正确的。

什么会导致它在此过程中变得“错误”?

编辑:

在围绕问题添加一些调试“cout”信息后......它消失了。看起来我有一只黑森虫。

【问题讨论】:

  • 来自我系统上的文档:“如果无法创建子进程,或者无法获得命令语言解释器的终止状态,则 system() 应返回 -1 并设置 errno 以指示错误。” errno 是否也告诉您系统上的任何内容? (errno 在这里是否有用是系统特定的;实际上,返回值是否有意义甚至是系统特定的。)
  • 您要求我们调试我们看不到的代码。如果我理解正确,上面的代码本身就可以工作,对吧? (例如,如果其他代码运行脚本然后更改工作目录,那将完美地解释您的问题。)
  • 什么是操作系统,如果是*nix,你使用的shell是什么?
  • 在流程执行过程中最有可能改变的是流程状态。即当前目录。使用脚本的绝对路径(为了不硬编码,最好从路径创建到可执行文件)。

标签: c++ python system-calls exit-code


【解决方案1】:

您确定脚本正在运行吗?

试试

...
int res = system("/usr/bin/python /path/to/myscript.py");
if(res != 0){
    cerr << "Exit code was:" << res << endl;
}

【讨论】:

  • 问题已经回答了这个问题:“即使正确打印了“This will exit with code 0”这一行。”仅当脚本实际运行时才会打印该行。
  • 好吧,我的错,我会删除这个答案。
  • @hvd:好吧,无论如何,脚本至少从某个地方运行过一次。由于这段代码自己工作,完全有可能与这段代码不起作用的其他代码正在运行脚本,甚至可能更改工作目录。
  • @DavidSchwartz Ha,这是一些不错的创造性思维。我非常希望这是正确的:)
  • 不,呼叫不是从其他任何地方进行的。我将添加一些输出以确保在我的源代码上运行 grep 不会显示任何其他 python 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多