我有一个用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可执行文件的完整路径。
答案 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
);
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 ......