Python 代码在控制台中工作,但在由cron运行时不工作

Python 代码在控制台中工作,但在由cron运行时不工作,python,cron,Python,Cron,当我运行这段代码时,它可以很好地用于控制台。它不会产生错误 import sh import uuid import urllib print 'Ip ....' # Print only IP address from specific interface LineaX = sh.grep(sh.ifconfig('eth0'), '-oP', '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') # Asignar Variables IpX

当我运行这段代码时,它可以很好地用于控制台。它不会产生错误

import sh
import uuid
import urllib

print 'Ip ....'
# Print only IP address from specific interface
LineaX = sh.grep(sh.ifconfig('eth0'), '-oP', '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
# Asignar Variables
IpX = LineaX.splitlines()[0]
PuertaX= LineaX.splitlines()[1]
MascaraX = LineaX.splitlines()[2]
MacX = ':'.join(['{:02x}'.format((uuid.getnode() >> i) & 0xff) for i in range(0,8*6,8)][::-1])
DataX = open('/etc/resolv.conf').read().split()
for item in DataX:
    if len( item.split(".") ) == 4:
        Dns1X = item
        Dns2X = '000.000.000.000'
    # Actualizar informacion
urllib.urlopen('http://www.miurl.com/file.php?mac='+ MacX + '&ip=' + IpX + '&mascara='+ MascaraX + '&puerta='+ PuertaX + '&dns1='+ Dns1X + '&dns2='+ Dns2X )
print 'Ip ... OK'
在cronjob中,会产生以下错误:

回溯(最近一次呼叫最后一次):
文件“/home/pi/system/sensor_ip.py”,第7行,在
LineaX=sh.grep(sh.ifconfig('eth0'),'-oP','[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
文件“/usr/local/lib/python2.7/dist packages/sh.py”,第2301行,在__
返回self.\uu env[名称]
文件“/usr/local/lib/python2.7/dist packages/sh.py”,第2232行,在__
返回命令。_create(k,**self.bake_args)
文件“/usr/local/lib/python2.7/dist-packages/sh.py”,第776行,在创建
raise CommandNotFound(程序)
sh.CommandNotFound:ifconfig

有什么不对的吗?

使用
sh
您需要导入所需的命令,例如:

from sh import ifconfig
这就是您看到错误的原因:

sh.CommandNotFound: ifconfig

如果它在shell上工作正常,但在cron中没有,那么问题是您需要指定二进制文件的绝对路径,因为cron没有
路径

我在直接读取sh.py时解决了同样的问题

因为
crontab
有自己的shell或脚本运行路径,
sh.py
执行
306 fpath,fname=os.PATH.split(program)
,它返回空,这意味着在路径中找不到
ifconfig
位置,所以抛出NONE错误

 # /usr/local/lib/python2.7/dist-packages/sh.py
 300 def which(program):
 301     def is_exe(fpath):
 302         return (os.path.exists(fpath) and
 303                 os.access(fpath, os.X_OK) and
 304                 os.path.isfile(os.path.realpath(fpath)))
 305
 306     fpath, fname = os.path.split(program)
 307     #lucifer
 308     #print 'fpath={0},fname={1}'.format(fpath,fname)
 309     if fpath:
 310         if is_exe(program):
 311             return program
 312     else:
 313         if "PATH" not in os.environ:
 314             return None
 315         for path in os.environ["PATH"].split(os.pathsep):
 316             exe_file = os.path.join(path, program)
 317             if is_exe(exe_file):
 318                 return exe_file
因此,您需要添加命令(例如os.environ中的
ifconfig
path) 我将它添加到crontab的script.py中

#Crontab PATH is not same compared with user.path
#This is for sh.commands
if '/sbin' not in os.environ['PATH']:
    os.environ['PATH'] += ':/sbin'

答对了!一切正常!

始终显示完整的错误回溯。为什么不阅读错误消息并进行回溯?他们会尽可能多地为您提供错误的线索。如果您仍然需要帮助,请在此处发布完整的回溯。代码到底做了什么,回溯也会给您一行错误发生的地方ed,您是否安装了多个版本的python?它可能在cronjob中使用错误的版本运行此错误:回溯(最近一次调用):文件“/home/pi/system/sensor_ip.py”,第7行,在LineaX=sh.grep(sh.ifconfig('eth0'),'-oP'),'[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'文件中“/usr/local/lib/python2.7/dist-packages/sh.py”,在getattr-return-self.\uu-env[name]文件/usr/local/lib/python2.7/dist-packages/sh.py中的第2301行,在getitem-return命令中的第2232行。\ u-create(k,**self.bake-args)文件“/usr/local/lib/python2.7/dist-packages-sh.py”,在\u-create-raise-CommandNotFound(程序)中的第776行sh.CommandNotFound:ifconfigHi jbrown:我进行了调整,但现在出现了以下错误:
回溯(最近一次调用):File”/home/pi/system/sensor\u ip.py“,第4行,在from sh import ifconfig importorror中:无法导入名称ifconfig
如果我已经安装了,我是这样安装的:
apt get install python pip pip install sh
Yeah应该就是那一个。请阅读有关为二进制文件提供完整路径的文档。这可能是我前面提到的cron中的路径问题。