【问题标题】:Executing Python Script from C++ program in Windows XP在 Windows XP 中从 C++ 程序执行 Python 脚本
【发布时间】:2015-08-28 18:08:15
【问题描述】:

我正在尝试从 C++ 程序执行 python 脚本。我遇到的问题是我无法执行我的 python 脚本。

如果我通过将 lpParameter 值设置为 NULL 来取出它,一切正常,我的程序启动 python 终端,然后当我退出 python 终端时我的程序完成。

我感觉它与 lpParameters 字段用空格分隔参数有关,所以我尝试将整个 python 脚本放在转义引号中。

#include "windows.h"
#include "shellapi.h"
#include <iostream>

using namespace std;

int main()
{
    cout<<"About to execute the shell command";

    SHELLEXECUTEINFO shExecInfo;
    shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    shExecInfo.fMask = NULL;
    shExecInfo.hwnd = NULL;
    shExecInfo.lpVerb = "runas";
    shExecInfo.lpFile = "C:\\Python25\\python.exe";
    shExecInfo.lpParameters = "\"C:\\Documents and Settings\\John Williamson\\My Documents\\MyPrograms\\PythonScripts\\script.py\"";
    shExecInfo.lpDirectory = NULL;
    shExecInfo.nShow = SW_NORMAL;
    shExecInfo.hInstApp = NULL;
    ShellExecuteEx(&shExecInfo);


    return 0;
}

当我启动此代码时会发生什么情况是我的程序运行,快速弹出另一个快速消失的终端,然后我的原始终端说任务已完成。实际上,虽然我指定的 python 脚本从未执行过。

【问题讨论】:

  • 如果您将脚本包装在try: ... except: ... 中,您可以让它打印堆栈跟踪,然后调用input/raw_input 以防止它立即关闭。当您以这种方式调用时,环境变量可能会有所不同,因此值得看看 Python 脚本是否真的抛出错误并因此而关闭。
  • 我自己单独执行了python脚本,python脚本没有任何问题。它只是使用 time.sleep(10) 方法暂停然后将一些数据写入文件。
  • 但是脚本的位置、环境变量和位置都可能受到调用位置和调用方式的影响。您可能仍需要更改 C++ 脚本来解决此问题,但您可以通过将错误日志添加到 Python 脚本来了解导致问题的原因。
  • 我认为脚本实际上从未被调用或传递给 python。我认为这与路径名中的空格以及将 lpParameters 分隔为空格的执行命令有关
  • 用一个简单的system() 电话代替ShellEcecute() 怎么样??

标签: python c++ escaping shellexecute


【解决方案1】:

不是真正的答案,但评论太长了。

这种在新窗口中执行的问题,一旦程序结束,窗口就会关闭。由于打开了一个窗口,从启动程序的角度来看,可能一切正常。

我的建议是使用cmd /k 来强制窗口在程序结束后保持打开:

shExecInfo.lpFile = "cmd";
shExecInfo.lpParameters = "/k C:\\Python25\\python.exe \"C:\\Documents and Settings\\John Williamson\\My Documents\\MyPrograms\\PythonScripts\\script.py\"";

至少如果任何地方出现错误,您将有机会看到它。

【讨论】:

    【解决方案2】:

    原来问题在于权限和设置此参数:

    shExecInfo.lpVerb = "runas";
    

    我离开了它

    shExecInfo.lpVerb = NULL;
    

    并且还填写了目录参数,它现在正在工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2011-07-10
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2012-05-19
      相关资源
      最近更新 更多