2016-10-04 12 views
0

私はC++で書かれたプログラムを持っています。私はそれから実行可能なpythonへのフルパスを取得したいと思います。たとえば、Windowsのコマンドプロンプト(cmd.exe)を開いてpythonと入力すると、PATHのpython実行可能ファイルが使用されます。だから、私は機能を持っていますget_exec_path("python") whickはC:\Python27\python.exeのようなものを返します。 C:\Python27\は私のPATHにあります。 私はこれをC++コードからpythonスクリプトを呼び出すために必要とします。 PythonをC++に組み込むことは、私の目的にとっては悪い考えです。Pythonの実行可能なフルパスをC++から取得

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

この方法ではコマンドプロンプトウィンドウが表示されますが、私は何らかのバックグラウンド作業をしたいと思います。この目的のために、私はと2番目の引数"C:\Python27\python.exe myscript.py --arg1 arg1 --arg2 arg2"を使用しました。だから、PATH変数からpython実行可能ファイルへのフルパスが必要です。

+1

は、あなたがこの問題のために、あなたの試みを示してもらえますか? –

+0

なぜこれが必要だと思いますか? –

+0

@LightnessRacesinOrbit私はPythonスクリプトをC++コードから呼び出す必要があります。 PythonをC++に組み込むことは私にとっては悪い考えです。 – sashadereh

答えて

2

あなたは間違った質問をしています。代わりに、シェルを回避しようとしている(そしてそうしながら、PATH変数を再発明)の

コマンドプロンプトウィンドウを隠すためstartに適切なフラグを渡すことによって、あなたの利点にそれを使用しています。

the documentationによると、それは/bです:

は、新しいコマンドプロンプトウィンドウを開かずにアプリケーションを起動します。

+0

常に**あなたがそれらを最大限に活用する方法を見つけるために、使用しているツールのドキュメント**をお読みください。推測によるプログラミングは機能しません。 –

+0

残念ながら、それは非表示のPythonインタプリタウィンドウですが、Windowsのコマンドプロンプトではなく、std :: systemによって呼び出されます。 – sashadereh

+0

@sasha [CreateProcess'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v = vs.85).aspx)のドキュメントを読むと、それは検索パスを調べません。研究を止めないでください。 –

0

解決策がいくつかあります。

  • C++ツールを使用してWindowsレジストリから取得します。 {ver}を実際のバージョンに置き換えてください。私の場合は「3.5」だった。

    HKCU \ SOFTWARE \ Pythonの\ PythonCore \ {版} \ INSTALLPATH \ ExecutablePath

  • 使用PATH検索を実行するためのwhere.exeユーティリティ。それはlinux "のように"動作します。

    C:\ Users \ユーザー管理>ここでのpython
    C:\ Users \ユーザー管理\のAppData \ローカル\プログラム\ Pythonの\ Python35 \のpython.exe

0

は、Windows Pythonパスを示すとこの回答はWindowsに焦点を当て、ではなく portableです。 shwlapiから

機能が正確に何をしたいん:

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

そのdocumentationは言う:pszFileで指定されたファイルを検索しPathFindOnPath

を。 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を含める必要があります...

関連する問題