【发布时间】: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的路径在Emacsexec-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 命令),所以我真的需要得到这可以“按原样”工作,而不是变通。谢谢!
【问题讨论】:
-
我相信这是一个与路径相关的问题,我以前见过,但我不记得缺少什么路径。我会考虑一下。同时,考虑评估您正在使用的缓冲区中的 $PATH:
M-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 包含convert和gs)。 (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