Запустите пакетный внешний скрипт при экспорте в 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 будет совершенно другим, поэтому файл тоже должен быть там.

Другие вопросы по тегам