crontab with sudo python script
Question: Alright, I've found something. Not sure how to tackle it. I've seen that this
is a common error that comes up in google. The error seems to have something
to do with the environment variables or something. Not sure how to handle
this:

This is the code and it's the part where subprocess is called that leads to
the error:

    
    
    #!/usr/bin/python
    
    import subprocess
    import re
    import sys
    import time
    import datetime
    import gspread
    
    # ===========================================================================
    # Google Account Details
    # ===========================================================================
    
    # Account details for google docs
    email       = 'my_email@gmail.com'
    password    = 'my_password'
    spreadsheet = 'my_spreadsheet'
    
    # ===========================================================================
    # Example Code
    # ===========================================================================
    
    
    # Login with your Google account
    try:
      gc = gspread.login(email, password)
    except:
      print "Unable to log in.  Check your email address/password"
      sys.exit()
    
    # Open a worksheet from your spreadsheet using the filename
    try:
      worksheet = gc.open(spreadsheet).sheet1
      # Alternatively, open a spreadsheet using the spreadsheet's key
      # worksheet = gc.open_by_key('0BmgG6nO_6dprdS1MN3d3MkdPa142WFRrdnRRUWl1UFE')
    except:
      print "Unable to open the spreadsheet.  Check your filename: %s" % spreadsheet
      sys.exit()
    
    # Continuously append data
    while(True):
      # Run the DHT program to get the humidity and temperature readings!
    
      output = subprocess.check_output(["./Adafruit_DHT", "2302", "17"]);
      print output
      matches = re.search("Temp =\s+([0-9.]+)", output)
      if (not matches):
            time.sleep(3)
            continue
      temp1 = float(matches.group(1))
      temp = temp1*9/5+32 # added the extra step to converto to fahrenheit
    
      # search for humidity printout
      matches = re.search("Hum =\s+([0-9.]+)", output)
      if (not matches):
           time.sleep(3)
           continue
      humidity = float(matches.group(1))
    
      print "Temperature: %.1f F" % temp
      print "Humidity:    %.1f %%" % humidity
    
      # Append the data in the spreadsheet, including a timestamp
      try:
        values = [datetime.datetime.now(), temp, humidity]
        worksheet.append_row(values)
      except:
        print "Unable to append data.  Check your connection?"
        sys.exit()
    
      # Wait 30 seconds before continuing or just exit
      print "Wrote a row to %s" % spreadsheet
    #  time.sleep(60)
      sys.exit()
    

that's basically it. It works fine using 'sudo python script.py' as long as
the Adafruit_DHT program is in the same directory.

Here's the error I get:

    
    
    Traceback (most recent call last):
      File "/home/pi/Adafruit/dht/Ada_temp.py", line 44, in <module>
        output = subprocess.check_output(["./home/pi/Adafruit/dht/Adafruit_DHT", "2302", "17"]);
      File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
        process = Popen(stdout=PIPE, *popenargs, **kwargs)
      File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1259, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    

I've tried adding the full path of the c program (Adafruit_DHT), to no
avail...


Answer: Locate the problem.

  1. Does the script run at all? Do something trivial in the first line of the script to see that it actually gets executed from **cron** (e.g.: write to a file in /tmp).

  2. Once you managed to run it, look for other problems. Cron can be set up to send the a mail with the output of the script. One obvious thing I see is: `./Adafruit_DHT`, relative path is used, that's a bad sign, the cron script is probably not executed in the directory you think it does. Fix it (= use absolute path).

