I have a python script that is causing some problems in the environment it's being run. I was told that it "does not release file pipes that it opens to read the data." I believe the problem is in the last line. I want to make sure I make the correct changes. This is running in Python 2.7 environment Thanks.
#!/usr/bin/env python import subprocess import urllib from xml.dom import minidom ZIPCODE = '06840' TEMP_TYPE = 'f' HVAC_ZONES = ['HVAC'] TSTAT = 5 WEATHER_URL = 'http://xml.weather.yahoo.com/forecastrss?p=' + ZIPCODE +'&u=' + TEMP_TYPE WEATHER_NS = 'http://xml.weather.yahoo.com/ns/rss/1.0' dom = minidom.parse(urllib.urlopen(WEATHER_URL)) ycondition = dom.getElementsByTagNameNS(WEATHER_NS, 'condition')[0] CURRENT_OUTDOOR_TEMP = ycondition.getAttribute('temp') for zone in HVAC_ZONES: i =0 while i < TSTAT: i += 1 subprocess.Popen(['/Users/RPM/Applications/RacePointMedia/sclibridge','writestate', zone + '.HVAC_controller.ThermostatCurrentRemoteTemperature'+ '_' + str(i),CURRENT_OUTDOOR_TEMP + TEMP_TYPE.upper()], stdin=subprocess.PIPE) I know I need to add a close but wan't to make sure I don't have any other memory leaks. Would I need to add
subprocess.close Would this be a better way to use subprocess.call? Do you need to release/close subprocess.call()?
#!/usr/bin/env python import subprocess import urllib from xml.dom import minidom ZIPCODE = '06457' TEMP_TYPE = 'f' # f - farhenheit c- celsius (case sensative) HVAC_ZONES = ['HVAC', 'HVAC2'] TSTAT = 64 WEATHER_URL = 'http://xml.weather.yahoo.com/forecastrss?p=' + ZIPCODE +'&u=' + TEMP_TYPE WEATHER_NS = 'http://xml.weather.yahoo.com/ns/rss/1.0' dom = minidom.parse(urllib.urlopen(WEATHER_URL)) ycondition = dom.getElementsByTagNameNS(WEATHER_NS, 'condition')[0] CURRENT_OUTDOOR_TEMP = ycondition.getAttribute('temp') print(CURRENT_OUTDOOR_TEMP) for zone in HVAC_ZONES: i =0 while i < TSTAT: i += 1 command = ['/Users/RPM/Applications/RacePointMedia/sclibridge','writestate', zone + '.HVAC_controller.ThermostatCurrentRemoteTemperature'+ '_' + str(i),CURRENT_OUTDOOR_TEMP + TEMP_TYPE] subprocess.call(str(command),shell=True) EDIT
OK I have rewritten this with suggestions however I still need shell=True see below
#!/usr/bin/env python #define imports import sys import subprocess import os from subprocess import STDOUT DEVNULL = open(os.devnull, "r+b") #start global definitions command = ['/Users/RPM/Applications/RacePointMedia/sclibridge servicerequest "Wine Cellar" "" "" "1" "" "Pause"'] #start main program subprocess.call(command, close_fds=True, stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT,shell=True) I have tried this without shell=True and I get the following error, my major concern is memory leaks.
File "./test.py", line 14, in <module> subprocess.call(commamd,close_fds=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 493, in call File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__ File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
subprocess.call(command). str(command) creates a python string representation of the list, it does not create something that a shell would recognize. subprocess.call will run the command and wait for it to complete. Any output from the command will be seen on your screen.