#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 …