【问题标题】:Python script calling shell script with Image Magick使用 Image Magick 调用 shell 脚本的 Python 脚本
【发布时间】:2015-11-18 12:43:10
【问题描述】:

我有一个 bash 脚本,它调用了 ImageMagick 中的“转换”命令。当我在终端中手动执行该脚本时,它可以正常工作。显然,我已将“转换”命令的路径添加到我的系统路径中。当我尝试使用另一个脚本(用 python 编写)执行它时,我遇到了一个错误,找不到“转换”。这是一个重现问题的简单示例。我在 OSX Maverick 上。


Shell 脚本:convert_svg_to_png.sh

#!/bin/bash
for filename in *.svg; do

        convert "$filename" "`basename $filename .svg`.png"

done

Python 脚本:runme.py

​​>
import subprocess

subprocess.call('./convert_svg_to_png.sh')

错误: ./convert_svg_to_png.sh:第 5 行:转换:找不到命令


知道为什么会出现这个错误吗?

编辑:修改 bash 脚本以包含转换函数的整个路径时。弹出这个新错误:

dyld:库未加载:/ImageMagick-6.8.9/lib/libMagickCore-6.Q16.2.dylib 引用自:%FullPath%convert 原因:找不到图片

python调用的shell是/bin/bash。和我的终端一样。

【问题讨论】:

  • 在你用来运行python的shell中,当你输入which convert时会发生什么
  • 还有你的$PATH在那个shell中设置了什么
  • 你确定如果你直接从同一个 shell 运行 shell 脚本,它可以工作吗?
  • 哪个python给出了这个: /Users/myusername/Desktop/libraries/ImageMagick-6.8.9/bin/convert 。 $PATH 还包括此文件夹: /Users/myusername/Desktop/libraries/ImageMagick-6.8.9/bin/ 。当我手动运行时它可以工作,我也得到了所需的输出。
  • hmmm,很奇怪,根据subprocess docs,默认行为是继承当前进程环境...

标签: python bash imagemagick subprocess imagemagick-convert


【解决方案1】:

一些事情......

  1. 确保您的$PATH 环境变量可以访问convert 实用程序。

    export PATH="${PATH}:/Users/myusername/Desktop/libraries/ImageMagick-6.8.9/bin"
    
  2. 如果ImageMagick的生态系统生活在一个特殊的地方,设置环境$MAGICK_HOME;这样,运行时库就可以找到所有内容。

    export MAGICK_HOME=/Users/myusername/Desktop/libraries/ImageMagick-6.8.9
    
  3. 调用subprocess.call时,设置关键字参数shell=True

    import subprocess
    
    subprocess.call('./convert_svg_to_png.sh', shell=True)
    

【讨论】:

  • 我尝试了上面的事情,但仍然是同样的错误。我认为即使从终端使用convert 实用程序,前两个步骤也是必要的。
  • 我不知道为什么,但在 OSX(10.11) 中只能在没有 shell=True 的情况下工作。
【解决方案2】:

好的,那么首先尝试验证您的计算机上是否安装了命令“convert”。我认为你会这样做。

which convert

python 程序

import subprocess

command = 'bash convert_svg_to_png.sh'.split()

try:
    result = subprocess.check_call(command)
    print('successful')
except subprocess.CalledProcessError:
    print('An error occurs')

如果你使用python3,那么你可以使用shutil.which,它将找到convert的系统路径或返回None

蟒蛇3

import shutil
import subprocess

result = shutil.which('convert')

if result:
    command = 'bash convert_svg_to_png.sh'.split()
    try:
        result = subprocess.check_call(command)
        print('successful')
    except subprocess.CalledProcessError:
        print('An error occurs')

您也可以使用 wand 包,它是 Imagemagick http://docs.wand-py.org/en/0.4.1/guide/write.html#convert-images-to-jpeg 的包装器,或者您可以去那个帖子看看是否有更好的方法 https://stackoverflow.com/a/19718153/2581266

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2020-10-02
    • 1970-01-01
    • 2016-06-22
    • 2014-06-05
    相关资源
    最近更新 更多