By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,079 Members | 927 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,079 IT Pros & Developers. It's quick & easy.

subprocess considered harmfull?

P: n/a
Hi all,

I've been trying to use (Python 2.4 on WinXP) the subprocess module to
execute a shell command (nmake in this case), and pass its output to a
higher level.

Using the following snippet:
p =
subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
universal_newlines=True, bufsize=1)
os.sys.stdout.writelines(p.stdout)
os.sys.stdout.writelines(p.stderr)
Works fine on the command line, but fails when called from within
Visual Studio, with the following error:
File "C:\Python24\lib\subprocess.py", line 549, in __init__
(p2cread, p2cwrite,
File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
p2cread = self._make_inheritable(p2cread)
File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
DUPLICATE_SAME_ACCESS)
TypeError: an integer is required

If I replace the functionality with:
p = os.popen4(nmake)
# p[1] = stdout_and_stderr result pipe
p[1].flush()
os.sys.stdout.writelines(p[1].readlines())
All is well.

I have a feeling this has been encountered before (by googling here),
but didn't see any concise answer as to subprocess' robustness.
So what is the matter here? And should I consider the subprocess
module still unstable?

Cheers,
Uri

Sep 25 '05 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Hi also !

In other fields, I also found uses which did not function with subprocess,
but OK with popen2/4

@-salutations

Michel Claveau


Sep 25 '05 #2

P: n/a
Uri Nix wrote:
Using the following snippet:
p =
subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
universal_newlines=True, bufsize=1)
os.sys.stdout.writelines(p.stdout)
os.sys.stdout.writelines(p.stderr)
Works fine on the command line, but fails when called from within
Visual Studio, with the following error:
File "C:\Python24\lib\subprocess.py", line 549, in __init__
(p2cread, p2cwrite,
File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
p2cread = self._make_inheritable(p2cread)
File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
DUPLICATE_SAME_ACCESS)
TypeError: an integer is required


This looks like these known bugs:
http://python.org/sf/1124861
http://python.org/sf/1126208

Try setting stderr to subprocess.PIPE. I think that was what worked for
me. (You might also try setting shell=True. That's what I currently
have in my code that didn't work before.)

STeVe
Sep 25 '05 #3

P: n/a
Steven Bethard wrote:
Using the following snippet:
p =
subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
universal_newlines=True, bufsize=1)
os.sys.stdout.writelines(p.stdout)
os.sys.stdout.writelines(p.stderr)
Works fine on the command line, but fails when called from within
Visual Studio, with the following error:
File "C:\Python24\lib\subprocess.py", line 549, in __init__
(p2cread, p2cwrite,
File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
p2cread = self._make_inheritable(p2cread)
File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
DUPLICATE_SAME_ACCESS)
TypeError: an integer is required


This looks like these known bugs:
http://python.org/sf/1124861
http://python.org/sf/1126208

Try setting stderr to subprocess.PIPE. I think that was what worked for
me. (You might also try setting shell=True. That's what I currently
have in my code that didn't work before.)


if someone wants to investigate, is seeing this problem, and have the win32
extensions on their machine, try changing this line in subprocess.py:

if 0: # <-- change this to use pywin32 instead of the _subprocess driver

to:

if 1: # <-- change this to use _subprocess instead of the pywin32 driver

and see if it either fixes the problem (not very likely) or gives you a better
error message (very likely).

</F>

Sep 25 '05 #4

P: n/a

"Fredrik Lundh" <fr*****@pythonware.com> wrote in message news:ma************************************@python .org...
Steven Bethard wrote:
> Using the following snippet:
> p =
> subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
> universal_newlines=True, bufsize=1)
> os.sys.stdout.writelines(p.stdout)
> os.sys.stdout.writelines(p.stderr)
> Works fine on the command line, but fails when called from within
> Visual Studio, with the following error:
> File "C:\Python24\lib\subprocess.py", line 549, in __init__
> (p2cread, p2cwrite,
> File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
> p2cread = self._make_inheritable(p2cread)
> File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
> DUPLICATE_SAME_ACCESS)
> TypeError: an integer is required


This looks like these known bugs:
http://python.org/sf/1124861
http://python.org/sf/1126208

Try setting stderr to subprocess.PIPE. I think that was what worked for
me. (You might also try setting shell=True. That's what I currently
have in my code that didn't work before.)


if someone wants to investigate, is seeing this problem, and have the win32
extensions on their machine, try changing this line in subprocess.py:

if 0: # <-- change this to use pywin32 instead of the _subprocess driver

to:

if 1: # <-- change this to use _subprocess instead of the pywin32 driver

and see if it either fixes the problem (not very likely) or gives you a better
error message (very likely).

</F>


The error msg is only slightly better:

error: (6, 'DuplicateHandle', 'The handle is invalid.')

Basically, gui apps like VS don't have a console, so
GetStdHandle returns 0. _subprocess.GetStdHandle
returns None if the handle is 0, which gives the original
error. Pywin32 just returns the 0, so the process gets
one step further but still hits the above error.

Subprocess.py should probably check the
result of GetStdHandle for None (or 0)
and throw a readable error that says something like
"No standard handle available, you must specify one"

Roger


----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Sep 26 '05 #5

P: n/a
Roger Upole wrote:
"Fredrik Lundh" <fr*****@pythonware.com> wrote in message news:ma************************************@python .org...
Steven Bethard wrote:
> Using the following snippet:
> p =
> subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
> universal_newlines=True, bufsize=1)
> os.sys.stdout.writelines(p.stdout)
> os.sys.stdout.writelines(p.stderr)
> Works fine on the command line, but fails when called from within
> Visual Studio, with the following error:
> File "C:\Python24\lib\subprocess.py", line 549, in __init__
> (p2cread, p2cwrite,
> File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
> p2cread = self._make_inheritable(p2cread)
> File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
> DUPLICATE_SAME_ACCESS)
> TypeError: an integer is required

This looks like these known bugs:
http://python.org/sf/1124861
http://python.org/sf/1126208

Try setting stderr to subprocess.PIPE. I think that was what worked for
me. (You might also try setting shell=True. That's what I currently
have in my code that didn't work before.)


if someone wants to investigate, is seeing this problem, and have the win32
extensions on their machine, try changing this line in subprocess.py:

if 0: # <-- change this to use pywin32 instead of the _subprocess driver

to:

if 1: # <-- change this to use _subprocess instead of the pywin32 driver

and see if it either fixes the problem (not very likely) or gives you a better
error message (very likely).

</F>


The error msg is only slightly better:

error: (6, 'DuplicateHandle', 'The handle is invalid.')

Basically, gui apps like VS don't have a console, so
GetStdHandle returns 0. _subprocess.GetStdHandle
returns None if the handle is 0, which gives the original
error. Pywin32 just returns the 0, so the process gets
one step further but still hits the above error.

Subprocess.py should probably check the
result of GetStdHandle for None (or 0)
and throw a readable error that says something like
"No standard handle available, you must specify one"

Roger


----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----


I gathered as much about why this happens in VS. A further question is
why does n't os.popen fall in the same trap?

Cheers,
Uri

Sep 26 '05 #6

P: n/a
"Uri Nix" <Ur*****@gmail.com> wrote in message news:11*********************@g49g2000cwa.googlegro ups.com...
Roger Upole wrote:
"Fredrik Lundh" <fr*****@pythonware.com> wrote in message news:ma************************************@python .org...
> Steven Bethard wrote:
>
>> > Using the following snippet:
>> > p =
>> > subprocess.Popen(nmake,stderr=subprocess.PIPE,stdo ut=subprocess.PIPE, \
>> > universal_newlines=True, bufsize=1)
>> > os.sys.stdout.writelines(p.stdout)
>> > os.sys.stdout.writelines(p.stderr)
>> > Works fine on the command line, but fails when called from within
>> > Visual Studio, with the following error:
>> > File "C:\Python24\lib\subprocess.py", line 549, in __init__
>> > (p2cread, p2cwrite,
>> > File "C:\Python24\lib\subprocess.py", line 609, in _get_handles
>> > p2cread = self._make_inheritable(p2cread)
>> > File "C:\Python24\lib\subprocess.py", line 650, in _make_inheritable
>> > DUPLICATE_SAME_ACCESS)
>> > TypeError: an integer is required
>>
>> This looks like these known bugs:
>> http://python.org/sf/1124861
>> http://python.org/sf/1126208
>>
>> Try setting stderr to subprocess.PIPE. I think that was what worked for
>> me. (You might also try setting shell=True. That's what I currently
>> have in my code that didn't work before.)
>
> if someone wants to investigate, is seeing this problem, and have the win32
> extensions on their machine, try changing this line in subprocess.py:
>
> if 0: # <-- change this to use pywin32 instead of the _subprocess driver
>
> to:
>
> if 1: # <-- change this to use _subprocess instead of the pywin32 driver
>
> and see if it either fixes the problem (not very likely) or gives you a better
> error message (very likely).
>
> </F>
>


The error msg is only slightly better:

error: (6, 'DuplicateHandle', 'The handle is invalid.')

Basically, gui apps like VS don't have a console, so
GetStdHandle returns 0. _subprocess.GetStdHandle
returns None if the handle is 0, which gives the original
error. Pywin32 just returns the 0, so the process gets
one step further but still hits the above error.

Subprocess.py should probably check the
result of GetStdHandle for None (or 0)
and throw a readable error that says something like
"No standard handle available, you must specify one"

Roger


----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----


I gathered as much about why this happens in VS. A further question is
why does n't os.popen fall in the same trap?

Cheers,
Uri

From a quick glance at the source, it looks like it always
creates new pipes.

Roger

----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+ Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----
Sep 26 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.