使用Python subprocess.call和crontab?

时间:2015-06-10 19:55:11

标签: python

我遇到了在crontab中运行的python脚本中使用subprocess.call的问题。我已经将此问题隔离为子进程无法找到7z可执行文件。我在FreeBSD 10.1上运行它,但这不应该有所作为。我尝试将pYTHONPATH = $ PATH添加到crontab,我尝试将shell = True添加到subprocess.call,我尝试使用/ usr / loca / bin / 7z而不是7z。这些都没有解决问题。我得到的错误如下:

/usr/local/bin/7z: realpath: not found
/usr/local/bin/7z: dirname: not found
exec: /../libexec/p7zip/7z: not found

以下是我在crontab中调用脚本的方法:

PATH=$PATH:/usr/local/bin
@every_minute           $HOME/test.py >> $HOME/test.error 2>&1

以下是我的脚本(test.py)的内容:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import subprocess
import tempfile

thing = 'blahblahblah'

errors = open('/home/myuser/error', 'wb')

with tempfile.TemporaryDirectory() as tmpdirname:
    tempthing = os.path.join(tmpdirname, thing)
    fh = open(tempthing, 'wb')
    fh.write(b'123')
    fh.close()
    zipname = '{}.zip'.format(thing)
    ziptempfile = os.path.join(tmpdirname, zipname)
    zipper = subprocess.call(['7z', 'a', '-p{}'.format('something'), '-tzip', '-y', ziptempfile, tempthing], stdout=errors, stderr=subprocess.STDOUT)

1 个答案:

答案 0 :(得分:1)

答案是crontab中的PATH变量必须使用如下的绝对路径:

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

这解决了一切。