Запуск inkscape без X-сервера

Я запускаю inkscape из процесса Gearman PHP в * nix-подобных системах (OS X 10.6.8, Linux разных версий) для преобразования изображений SVG в PNG или PDF. Я использую что-то вроде этого (разрывы строк добавлены здесь только для ясности):

/full/path/to/inkscape -z \
    --export-png=/path/to/output.png \
    --export-width=100 --export-height=100 \
    /path/to/input.svg

Это работает, но, несмотря на флаг -z («Не использовать X-сервер»), я получаю это в выводе консоли (в OS X):

Setting Language: .UTF-8

(process:44699): Gtk-WARNING **: Locale not supported by C library.
    Using the fallback 'C' locale.
Xlib:  extension "RANDR" missing on display "/tmp/launch-WvcqRh/org.x:0".

Это говорит мне о том, что inkscape загружает больше библиотек, чем нужно, и что он мог бы работать быстрее, если бы не пытался подключиться к X-серверу. Однако, кроме использования флага -z/--without-gui, я не уверен, что попробовать. Производительность на моей машине разработки по-прежнему меньше секунды (по крайней мере, для тривиальных файлов SVG), но я хотел бы исправить это, если смогу. Даже если лучшим ответом будет просто «подавить вывод ошибок»!

Может быть, если я выключу или сброслю переменную окружения bash DISPLAY? Я совсем не знаком с Х.


person halfer    schedule 01.04.2012    source источник


Ответы (3)


Да, если вы хотите, чтобы ваши программы вообще не находили X, вы можете unset DISPLAY перед запуском процесса.

Вы также можете использовать Xvfb для «подделки» X-сервера: http://en.wikipedia.org/wiki/Xvfb

Вы также можете посмотреть на эти инструменты:

Их исходный код действительно небольшой.

person pzanoni    schedule 03.04.2012
comment
Спасибо, я попробую DISPLAY и отчитаюсь! Если это не даст результатов, я попробую Xvfb, но я буду запускать эту систему на очень низком VPS, поэтому хочу свести к минимуму дополнительное программное обеспечение. - person halfer; 03.04.2012
comment
Кстати; Я пробовал svg2pdf, конечно, на своем Mac, и, похоже, он не очень хорошо справляется с визуализацией документа Inkscape SVG - все различные стили шрифтов из одного семейства отображались как вариант по умолчанию. (Возможно, мне нужно что-то настроить здесь, но inkscape просто угадал). - person halfer; 03.04.2012
comment
Я пробовал DISPLAY='' inkscape --export-png=output.png input.svg, а также сценарий bash с unset DISPLAY, а затем с командой inkscape, и ни один из них не подавлял «Gtk-WARNING». Как и вы, я ожидал, что это сработает — ба! - person halfer; 06.04.2012
comment
В данный момент у меня нет времени проверять Xvrb, но я думаю, что это сработает (за что ставлю галочку). Еще раз спасибо за ваш ответ. А пока я просто буду подавлять ошибки с помощью 2>/dev/null! :-) - person halfer; 06.04.2012
comment
Если я unset DISPLAY получаю три ошибки CRITICAL (dbus_g_proxy_nw_for_name...) - person nowox; 07.08.2020

Другой способ подавить вывод, сохраняя при этом способность реагировать на истинные ошибки, — вызвать Inkscape из Python.

import subprocess               # May want to use subprocess32 instead

cmd_list = [ '/full/path/to/inkscape', '-z', 
             '--export-png', '/path/to/output.png',
             '--export-width', 100,
             '--export-height', 100,
             '/path/to/input.svg' ]

# Invoke the command.  Divert output that normally goes to stdout or stderr.
p = subprocess.Popen( cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE )

# Below, < out > and < err > are strings or < None >, derived from stdout and stderr.
out, err = p.communicate()      # Waits for process to terminate

# Maybe do something with stdout output that is in < out >
# Maybe do something with stderr output that is in < err >

if p.returncode:
    raise Exception( 'Inkscape error: ' + (err or '?')  )

В моей системе Mac OS грубые сообщения о состоянии (описанные в оригинальном постере) заканчиваются в err. Кроме того, для конкретного задания, которое я выполнял, есть дополнительные сообщения, которые заканчиваются на out:

Background RRGGBBAA: ffffff00
Area 0:0:339:339 exported to 100 x 100 pixels (72.4584 dpi)
Bitmap saved as: /path/to/output.png

(Входной файл svg имел размер 339 на 339 пикселей.)

person Iron Pillow    schedule 05.10.2017

person    schedule
comment
Привет, спасибо за это. Можете ли вы объяснить мне это дальше? Я не эксперт оболочки, но меня смущает аргумент --export-plain-svg для echo. Суть вашей техники в том, что данные изображения передаются в команду inkscape с нулевой переменной env DISPLAY? - person halfer; 16.01.2014