Получить полный путь к исполняемому файлу python из C

#python #c

#python #c

Вопрос:

У меня есть программа, написанная на C . Я хотел бы получить из него полный путь к исполняемому файлу python. Например, если я открою командную строку Windows (cmd.exe ) и введите python, он использует исполняемый файл python PATH . Итак, я хотел бы, чтобы функция get_exec_path("python") whick возвращала что-то вроде C:Python27python.exe . C:Python27 находится в моем PATH . Мне это нужно для вызова скриптов python из кода C . Встраивание python в C — плохая идея для моих целей. Раньше я называл это так:

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

но этот метод показывает окно командной строки, я хотел бы какую-то фоновую работу. Для этой цели я использовал CreateProcess второй аргумент "C:Python27python.exe myscript.py --arg1 arg1 --arg2 arg2" . Итак, мне нужен полный путь к исполняемому файлу python из PATH переменной.

Комментарии:

1. Не могли бы вы показать свои попытки решения этой проблемы?

2. Как вы думаете, зачем вам это нужно?

3. @LightnessRacesinOrbit Мне нужно вызвать скрипт python из кода C . Встраивание python в c — плохая идея для меня.

4. @Mr.goosberry хотели бы вы увидеть пустую функцию std::string get_exec_path() ? Я знаю функцию GetModuleFileName() , но здесь это бесполезно.

5. Вы должны использовать оболочку. Вместо того, чтобы искать способ удалить оболочку из уравнения, найдите способ сделать ее невидимой! technet.microsoft.com/en-gb/library/bb491005.aspx

Ответ №1:

Вы задаете неправильный вопрос.

Вместо того, чтобы пытаться обойти оболочку (и PATH при этом заново создавать переменную), используйте ее в своих интересах, передав соответствующие флаги start для скрытия окна командной строки.

Согласно документации, это /b :

Запускает приложение, не открывая новое окно командной строки.

Комментарии:

1. Всегда читайте документацию к используемым вами инструментам, чтобы узнать, как вы можете получить от них максимальную отдачу. Программирование путем угадывания не работает.

2. К сожалению, это окно интерпретатора hide python, но не командная строка Windows, которая вызывается std::system, поэтому ваше решение мне не подходит.

3. @sasha Вы также можете прочитать документацию CreateProcess , чтобы узнать, что она просматривается в путях поиска. Не прекращайте исследования.

Ответ №2:

Есть несколько решений, которые могут вам помочь.

  • Получить из реестра Windows с помощью инструментов C . Замените {ver} на фактическую версию. «3.5» было в моем случае.

    HKCU SOFTWARE Python PythonCore {ver}InstallPathExecutablePath

  • Используйте where.exe утилита для выполнения поиска ПУТИ. Он работает как linux «который».

    C:Usersadmin >где python
    C:UsersadminAppDataLocalProgramsPythonPython35python.exe

Ответ №3:

Поскольку вы показываете путь к Python для Windows, этот ответ будет посвящен 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 …