【问题标题】:Imagemagick (convert) error only when called from emacs仅在从 emacs 调用时出现 Imagemagick(转换)错误
【发布时间】:2016-01-20 05:39:00
【问题描述】:

我正在尝试使用 ImageMagick 的 convert 工具将 Emacs 中的 pdf 转换为 png。我正在使用以下 elisp 命令:

(call-process "convert" nil "test" t "/path/to/test.pdf" "/path/to/test.png")

给出结果

convert: no images defined `/path/to/test.png' @ error/convert.c/ConvertImageCommand/3241.

但是,如果我运行

$ convert test.pdf test.png

从命令终端一切正常,我得到了正确的 png 文件。

这是我尝试过的:

  • 我确认convert 的路径在Emacs exec-path 变量中
  • 我尝试使用干净的 .emacs 启动 Emacs
  • 我还检查了 Ghostscript 的 gs 是否可用(来自终端和 call-process,因为这似乎在我在网上看到的其他地方引起了类似的问题

我在 Mac OSX (Yosemite) 上使用 Emacs 24.5,通过自制软件安装 ImageMagick 6.9.2-10,通过自制软件安装 Ghostscript 9.07。

任何帮助将不胜感激。顺便说一句,使用 Emacs 中的convert 的动机是,我可以得到从 org-mode/org-babel 导出的 Latex (tikz) 图形块(它使用几乎相同的 call-process 命令),所以我真的需要得到这可以“按原样”工作,而不是变通。谢谢!

【问题讨论】:

  • 我相信这是一个与路径相关的问题,我以前见过,但我不记得缺少什么路径。我会考虑一下。同时,考虑评估您正在使用的缓冲区中的 $PATHM-x eval-expression RET (getenv "PATH") RET 这不是 convert 的路径,而是 convert 依赖的另一个路径。
  • 就是这样!谢谢! convert 路径在 exec-path 中,但不是 (getenv "PATH") 返回的路径,所以我将 (setenv "PATH" (concat (getenv "PATH") ":/usr/local/bin")) 添加到 .emacs 中,现在它可以工作了(其中 /usr/local/bin 包含 convertgs)。 (getenv "PATH") 返回什么?显然convert 路径在我的shell PATH 变量中...
  • (getenv "PATH") 应该返回 Emacs 使用的路径的值。 Emacs 不(默认情况下)使用返回的相同路径,比如说 Terminal.app。有些人使用一个流行的库(但我从未尝试过)——github.com/purcell/exec-path-from-shell——将 Emacs 设置为系统范围的路径。我喜欢在缓冲区本地基础上设置它:(set (make-local-variable 'process-environment) (mapcar 'concat process-environment)) (setenv "PATH" (concat (getenv "PATH") ":/Users/HOME/.0.data/.0.emacs/texlive/2012/bin/x86_64-darwin"))——例如,当我处于自定义 tex 模式时。
  • 只是澄清一下:exec-path-from-shell 不采用“系统范围的路径”并在 Emacs 中使用它。 Emacs 通常使用“系统范围的路径”,Terminal.app 是一个例外,您可以获得其他 $PATH (因为相应的设置在您的 ~/.bashrc 或类似的东西中),然后是 exec-path-from-shell尝试提取您在终端中获得的 $PATH 并告诉 Emacs 使用它。更好的解决方案是将您的 $PATH 设置从您的 ~/.bashrc 移动到它确实会影响系统范围设置的其他位置(例如,~/.something/environment.plist 如果仍然有效)。

标签: macos emacs imagemagick elisp


【解决方案1】:

我通常会使用 emacs 命令 shell-commando (M-!) 或 M-x shell-command 然后转换 /path/to/pdf.pdf /path/to/pdf.png。通常它应该与现有目录一起工作得更好 或者如果你想使用 emacs lisp 我用 emacs 打开目录,在一个缓冲区内,然后在该缓冲区上执行 ielm。

为了执行这个命令,我也推荐你使用函数 shell-command。这是 ielm 和消息中的输出:

ELISP> (shell-command "ls")
0 (#o0, #x0, ?\C-@)
ELISP> (shell-command "ls")
0 (#o0, #x0, ?\C-@)
ELISP> (shell-command "convert pdf.pdf pdf.png")
0 (#o0, #x0, ?\C-@)
ELISP> (shell-command "ls")
0 (#o0, #x0, ?\C-@)
ELISP> (shell-command "pwd")
0 (#o0, #x0, ?\C-@)

如果你想使用调用过程,正确的语法是:

ELISP> (call-process "convert" nil t nil "pdf.pdf" "pdf.png")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 2013-04-01
    • 2018-07-15
    • 2013-03-06
    • 1970-01-01
    • 2018-11-13
    • 2011-06-29
    • 2016-04-30
    相关资源
    最近更新 更多