create & read from tempfile
Try this:
import tempfile
import commands
import os
commandname = "cat"
f = tempfile.NamedTemporaryFile(delete=False)
f.write("oh hello there")
f.close() # file is not immediately deleted because we
# used delete=False
res = commands.getoutput("%s %s" % (commandname,f.name))
print res
os.unlink(f.name)
It just prints the content of the temp file, but that should give you the right idea. Note that the file is closed (f.close()
) before the external process gets to see it. That's important -- it ensures that all your write ops are properly flushed (and, in Windows, that you're not locking the file). NamedTemporaryFile
instances are usually deleted as soon as they are closed; hence the delete=False
bit.
If you want more control over the process, you could try subprocess.Popen
, but it sounds like commands.getoutput
may be sufficient for your purposes.
Use a NamedTemporaryFile
and its member name
instead. A regular TemporaryFile
isn't even guaranteed to have a name, due to the way Unix filesystems work.
If you need a temporary file with a name you have to use the NamedTemporaryFile
function. Then you can use temp.name
. Read
http://docs.python.org/library/tempfile.html for details.
Complete example.
import tempfile
with tempfile.NamedTemporaryFile() as temp:
temp.write('Some data')
if should_call_some_python_function_that_will_read_the_file():
temp.seek(0)
some_python_function(temp)
elif should_call_external_command():
temp.flush()
subprocess.call(["wc", temp.name])
Update: As mentioned in the comments, this may not work in windows. Use this solution for windows
Update 2: Python3 requires that the string to be written is represented as bytes, not str, so do instead
temp.write(bytes('Some data', encoding = 'utf-8'))