Win XP: Problem with shell scripting in Python
A.M
alanalan at newsgroup.nospam
Mon Jun 12 11:00:31 EDT 2006
>Does it overcome the problem that you reported earlier, that the
contents of the output file from BCP were out of order?
Yes, it does. But, to be honest, I don't know how!!!
"John Machin" <sjmachin at lexicon.net> wrote in message
news:4489efa0 at news.eftel.com...
> On 10/06/2006 3:00 AM, A.M wrote:
>> Here is what I came up with after John and Fredrik's help.
>>
>> import os
>> import sys
>> def Execute(shell_command,logStream = sys.stdout):
>> print >>logStream, shell_command
>> child_stdin, child_stdout_and_stderr = os.popen4(shell_command)
>> commad_output = child_stdout_and_stderr.read()
>> print >>logStream, commad_output
>> return_code = child_stdout_and_stderr.close()
>> return_code = return_code or child_stdin.close()
>> print >>logStream, "Return Code: " , return_code
>>
>> Execute ("DIR")
>>
>> Execute ("MD :")
>>
>> I tested it and so far it behaves the way that I want.
>>
>
> Does it overcome the problem that you reported earlier, that the contents
> of the output file from BCP were out of order? If not, you may like to try
> popen3(). It's quite possible (and indeed desirable) that the child's
> stderr is not buffered (so that error messages appear immediately) but the
> child's stdout is buffered (for efficiency), and when the buffer is
> flushed governs the order of appearance in a single output stream.
>>
>>
>> The tricky part is that when you use popen4, you have to close both
>> returned streams to be able to get the return code. I wasn't able to find
>> that in the documentation.
>
> In general it is good practice to hand back resources (e.g. close files)
> explicitly as soon as you are finished with them. This is especially
> important for files open for writing, in case there are problems like out
> of disk space, device not functioning etc. Also when you are dealing with
> a child process it makes some sense to close its stdin first just in case
> it is waiting for that, and will then write something to stdout, which may
> fail, causing it to write to stderr. So I guess that the documenter didn't
> stumble onto the "tricky part" :-)
>
> The "tricky part" for popen and friends seems to be that the return code
> is handed back upon close of the *last* file:
>
> |>>> h = os.popen3('md : ')
> |>>> [h[x].close() for x in 2, 1, 0]
> [None, None, 1]
>
> Looks like you get to report a documentation "problem" after all :-)
>
> Cheers,
> John
>
>
More information about the Python-list
mailing list