从C ++获取python可执行完整路径

时间:2016-10-04 11:32:23

标签: python c++

我有一个用C ++编写的程序。我想从它获得python可执行文件的完整路径。例如,如果我打开Windows命令提示符(cmd.exe)并键入python,它将使用PATH中的python可执行文件。所以,我希望函数get_exec_path("python")返回类似C:\Python27\python.exe的函数。 C:\Python27\位于PATH。 我需要这个从C ++代码调用python脚本。在我的目的中,在C ++中嵌入python是一个坏主意。我以前称之为:

std::system("start \"\" /WAIT python myscript.py --arg1 arg1 --arg2 arg2")

但是这个方法显示了命令提示符窗口,我想要一些后台工作。为此,我使用CreateProcess和第二个参数"C:\Python27\python.exe myscript.py --arg1 arg1 --arg2 arg2"。所以,我需要从PATH变量获取python可执行文件的完整路径。

3 个答案:

答案 0 :(得分:2)

你问的是错误的问题。

不是试图绕过shell(并在执行此操作时重新发明PATH变量),而是通过将适当的标志传递给start来隐藏以利用它命令提示符窗口。

根据the documentation/b

  

在不打开新的命令提示符窗口的情况下启动应用程序。

答案 1 :(得分:0)

有一些解决方案可以帮到你。

  • 使用C ++工具从Windows注册表中获取。将{ver}替换为实际版本。在我的情况下,“3.5”。

    HKCU \ SOFTWARE \的Python \ PythonCore \ {版本} \安装路径\ ExecutablePath

  • 使用where.exe实用程序执行PATH搜索。它就像linux“which”。

    C:\ Users \ admin>其中python
    C:\ Users \用户管理\应用程序数据\本地\程序\的Python \ Python35 \ python.exe

答案 2 :(得分:0)

当您展示Windows Python路径时,此答案将专注于Windows并且可移植。

shwlapi的功能完全符合您的要求:

BOOL PathFindOnPath(
  _Inout_  LPTSTR  pszFile,
  _In_opt_ LPCTSTR *ppszOtherDirs
);

documentation说:

  

PathFindOnPath搜索pszFile指定的文件。如果在ppszOtherDirs中没有指定目录,它会尝试通过搜索标准目录(如System32)和PATH环境变量中指定的目录来查找文件。

要查找python.exe,您可以这样做:

char path[MAX_PATH] = "python.exe";
BOOL cr = ::PathFindOnPathA(path, NULL);
if (! cr) {
    //process error ...
}
// path now contains the full path

当心:您必须包含shlwapi.h并链接shlwapi.lib ......