【发布时间】: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