1

親クラスがデーモン化されているメソッド内でスクリプトを実行しようとしています。

autogamma.shは、ImageMagickをインストールする(そしてconvertを使用する)必要があるスクリプトであり、http ://www.fmwconcepts.com/imagemagick/autogamma/index.phpにあります。

import os
import subprocess
import daemon

class MyClass():
    def __init__(self):
        self.myfunc()
    def myfunc(self):
        script = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'autogamma.sh')
        cmd = ('/bin/sh %s -c average /tmp/c.jpg /tmp/d.jpg' % script).split(' ')
        ret = subprocess.Popen(cmd).communicate()

with daemon.DaemonContext():
    process = MyClass()
    process.run()

クラスMyClassのみを起動するときにスクリプトが正しく実行されます。envなどに問題があると思いますが、取得できません。

Rsync、mediainfo、ffprobeでも問題が発生しています。python-daemon1.6でPython2.7.3を使用し、mac os、centos 5.5、ubuntu12.04TLSでテスト済み

4

3 に答える 3

2

スクリプトは非常に短く、コマンド ライン引数、コメント、その他のカラー モードを読み取るためのコードを除外すると、75 行未満になります。私はそれをPythonに変換するだけです。

コメントが示唆するように、最善の方法は、ImageMagick の python ラッパーの 1 つを使用することです。

直接電話することもできますがconvert、おそらく面倒です。これがどのように見えるかの小さなスニペットです:

import subprocess

def image_magick_version():
    output = subprocess.check_output("/usr/local/bin/convert -list configure", shell=True)

    for line in output.split('\n'):
        if line.startswith('LIB_VERSION_NUMBER'):           
            _, version = line.split(' ', 1)
            return tuple(int(i) for i in version.split(','))

im_version = image_magick_version()    
if im_version < (6,7,6,6) or im_version > (6,7,7,7) :
    cspace = "RGB"
else:
    cspace = "sRGB"

if im_version < (6,7,6,7) or im_version > (6,7,7,7):
    setcspace = "-set colorspace RGB"
else:
    setcspace = ""
于 2012-10-24T21:31:08.673 に答える
0

環境問題が疑われる場合、私は次の2つのいずれかを行います。

  1. 「env--whatever-script」を使用してフォアグラウンドでスクリプトを実行します。これにより、環境がクリアされ、端末のstderrにエラーが送信されます。
  2. スクリプトを通常どおり実行しますが、stdoutとstderrを/ tmp内のファイルにリダイレクトします:whatever-script> / tmp / output 2>&1

これらにより、ttyのないスクリプトの不透明度が少し低くなります。

于 2012-10-24T23:13:20.977 に答える
0

私はついに問題を見つけました。それは実質的にパスの問題でした。ライブラリを調べたところ、次の便利なパラメーターが見つかりました。

    `working_directory`
        :Default: ``'/'``

        Full path of the working directory to which the process should
        change on daemon start.

        Since a filesystem cannot be unmounted if a process has its
        current working directory on that filesystem, this should either
        be left at default or set to a directory that is a sensible “home
        directory” for the daemon while it is running.

そこで、次のようにデーモンをセットアップしました。

with daemon.DaemonContext(working_directory='.'):
    process = MyClass()
    process.run()

これで、正しいパスがわかり、スクリプトが適切に実行されました。

于 2012-10-25T15:03:02.357 に答える