#node.js #subprocess #inkscape
#node.js #подпроцесс #чернильный пейзаж
Вопрос:
Когда я вызываю следующее в командной строке, это работает как шарм:
inkscape --with-gui --batch-process --export-filename=-
--actions="select-all;ObjectToPath"
/full/path/to/example.svg
Но когда я открываю Node.js и выполните тот же вызов в подпроцессе следующим образом:
const cp = require("child_process");
var child = cp.spawn(
"/usr/bin/inkscape",
[
"--with-gui",
"--batch-process",
"--export-filename=-",
'--actions="select-all;ObjectToPath"',
"/full/path/to/example.svg",
],
{
cwd: process.cwd(),
detached: true,
stdio: "inherit",
}
);
Я получаю следующую ошибку:
Unable to find: "select-all
verbs_action: Invalid verb: "select-all
Unable to find: ObjectToPath"
verbs_action: Invalid verb: ObjectToPath"
и файл возвращается (печатается в стандартный вывод) без изменений. Есть идеи, почему глаголы не найдены при запуске Inkscape в качестве подпроцесса, но не вызывается непосредственно из терминала? Я получаю эту же ошибку в ubuntu (20.04) и OSX, используя последнюю версию Inkscape (1.0.1 r73).
Ответ №1:
Когда вы используете cp.spawn
с массивом аргументов, вам не нужно заключать их во внутренние кавычки "select-all;ObjectToPath"
, как это было бы с оболочкой. (В оболочке кавычки не позволяют оболочке разделять командную строку на две строки. Из-за того же механизма — или его отсутствия — попытка использовать переменные оболочки, такие как $$
или переменные среды, такие как $PATH
, завершится неудачей при использовании cp.spawn
, так как нет ничего, что можно было бы проанализировать.)
Я бы предположил
const cp = require("child_process");
var child = cp.spawn(
"/usr/bin/inkscape",
[
"--with-gui",
"--batch-process",
"--export-filename=-",
"--actions=select-all;ObjectToPath",
"/full/path/to/example.svg",
],
{
cwd: process.cwd(),
detached: true,
stdio: "inherit",
},
);
помогло бы вам.
Комментарии:
1. Потрясающе! Сработало как шарм 🙂