当我运行此代码时,适用于控制台。它不会产生错误。
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中产生此错误:
Traceback (most recent call last):
File "/home/pi/system/sensor_ip.py", line 7, in <module>
LineaX = sh.grep(sh.ifconfig('eth0'), '-oP', '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 2301, in __getattr__
return self.__env[name]
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 2232, in __getitem__
return Command._create(k, **self.baked_args)
File "/usr/local/lib/python2.7/dist-packages/sh.py", line 776, in _create
raise CommandNotFound(program)
sh.CommandNotFound: ifconfig
我有什么不对的?
答案 0 :(得分:0)
使用Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> f = "C:/test/UpdatePackage/filelist"
>>> import os
>>> os.path.isfile(f)
True
>>>
,您需要导入所需的命令,例如:
sh
这就是您看到错误的原因:
from sh import ifconfig
如果它在shell上正常工作但在cron中没有工作,则问题是你需要指定二进制文件的绝对路径,因为crons没有sh.CommandNotFound: ifconfig
。
答案 1 :(得分:0)
我在直接阅读sh.py时解决了同样的问题!
由于crontab
有运行shell或脚本的OWN PATH,sh.py
执行306 fpath, fname = os.path.split(program)
,因此返回空,这意味着无法找到ifconfig
位置PATH,所以抛出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
路径
我将它添加到我的script.py for crontab
#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'
宾果!一切都好!