Запустите пакетный внешний скрипт при экспорте в AppImage
Я сделал свое собственное приложение с электроникой, и у меня возникла проблема с производственными сборками, когда дело доходит до запуска внешнего скрипта на Python.
Когда я запускаю код в среде разработчика, у меня появляется что-то вроде:
const out = spawnSync(PYTHON_LOCATION, ['-d', '-j', '-p', path, tempfile]);
и это работает хорошо, потому что PYTHON_LOCATION
является public/python.py
,
Однако, когда я использую электронный конструктор для создания AppImage, это не работает, потому что сценарий явно не может быть найден. Приложение AppImage представляет собой один файл, и очевидно, что публичный каталог с ним не экспортируется.
Есть ли решение этой проблемы?
Спасибо!
1 ответ
Когда AppImage выполняется AppDir
переменная установлена в среде процесса, поэтому вы должны проверить, существует ли эта переменная и задана ли она. Затем вы можете построить правильный путь к вашему скрипту Python.
Электрон объединяет большинство вещей в app.asar
файл, который, вероятно, содержит нужный вам файл. Проблема в том, что в сети есть одно или два благих намерения запрашивать файлы AppImage относительно самого контейнера, что, к сожалению, немного вводит в заблуждение. На самом деле никакие из этих вариаций не будут работать, как я уверен, вы обнаружили:
./PYTHON_LOCATION
/PYTHON_LOCATION
PYTHON_LOCATION
Решение в том, что вам нужно использовать __dirname
чтобы узнать, где находится изображение. Скорее всего, где-то в этой папке при запуске AppImage (но, конечно, не при запуске из IDE):
/tmp/.mount_YourApplicationNameHVTcDI/
И другие __dirname
есть (при условии, что приложение было создано из app/electron/
папка:
/tmp/.mount_YourApplicationNameHVTcDI/resources/app.asar/app/electron
Итак, ваше решение будет примерно таким:
Path.join(__dirname, PYTHON_LOCATION)
Несмотря на то, что Electron изучает ресурсы в app.asar
файл, он прозрачен для файловой системы и выглядит как папка. Следовательно, вы можете заглянуть внутрь, используя обычные команды файлового ввода-вывода.
Помните, что в среде IDE __dirname
будет совершенно другим, поэтому файл тоже должен быть там.