how to use subprocess.Popen execute "find" in windows
In cmd, I can use find like this.
C:\>netstat -an | find "445"
TCP0.0.0.0:4450.0.0.0:0 LISTENING
UDP0.0.0.0:445*:*
C:\>
And os.system is OK.
>>> import os
>>> os.system('netstat -an | find "445"')
TCP0.0.0.0:4450.0.0.0:0 LISTENING
UDP0.0.0.0:445*:*
0
>>>
But I don't know how to use subprocess.Popen to do this.
from subprocess import Popen, PIPE
p1 = Popen(['netstat', '-an'], stdout = PIPE)
p2 = Popen(['find', '"445"'], stdin = p1.stdout, stdout = PIPE)
print p2.stdout.read()
It doesn't work.
Because subprocess.Popen execute "find" like this.
C:\>find \"445\"
拒绝访问 - \
C:\>
It adds a '\' before each '"'.
How to remove the '\'?
Thank you.
--
http://mail.python.org/mailman/listinfo/python-list
Re: how to use subprocess.Popen execute "find" in windows
On 5月7日, 上午9时45分, Justin Ezequiel <[EMAIL PROTECTED]>
wrote:
> On May 6, 5:19 pm, [EMAIL PROTECTED] wrote:
>
>
>
> > In cmd, I can use find like this.
>
> > C:\>netstat -an | find "445"
> > TCP0.0.0.0:4450.0.0.0:0 LISTENING
> > UDP0.0.0.0:445*:*
>
> > C:\>
>
> > And os.system is OK.>>> import os
> > >>> os.system('netstat -an | find "445"')
>
> > TCP0.0.0.0:4450.0.0.0:0 LISTENING
> > UDP0.0.0.0:445*:*
> > 0
>
> > But I don't know how to use subprocess.Popen to do this.
>
> > from subprocess import Popen, PIPE
>
> > p1 = Popen(['netstat', '-an'], stdout = PIPE)
> > p2 = Popen(['find', '"445"'], stdin = p1.stdout, stdout = PIPE)
> > print p2.stdout.read()
>
> > It doesn't work.
> > Because subprocess.Popen execute "find" like this.
>
> > C:\>find \"445\"
> > 拒绝访问 - \
>
> > C:\>
>
> > It adds a '\' before each '"'.
> > How to remove the '\'?
> > Thank you.
>
> cannot help with the backslashes but try findstr instead of find
Thank you.
findstr doesn't need quotes, so it works.
--
http://mail.python.org/mailman/listinfo/python-list
Re: how to use subprocess.Popen execute "find" in windows
On 5月7日, 下午2时41分, alito <[EMAIL PROTECTED]> wrote:
> On May 6, 7:19 pm, [EMAIL PROTECTED] wrote:
>
> > In cmd, I can use find like this.
>
> > C:\>netstat -an | find "445"
> > TCP0.0.0.0:4450.0.0.0:0 LISTENING
> > UDP0.0.0.0:445*:*
>
> > C:\>
>
> > And os.system is OK.>>> import os
> > >>> os.system('netstat -an | find "445"')
>
> > TCP0.0.0.0:4450.0.0.0:0 LISTENING
> > UDP0.0.0.0:445*:*
> > 0
>
> > But I don't know how to use subprocess.Popen to do this.
>
> > from subprocess import Popen, PIPE
>
> > p1 = Popen(['netstat', '-an'], stdout = PIPE)
> > p2 = Popen(['find', '"445"'], stdin = p1.stdout, stdout = PIPE)
> > print p2.stdout.read()
>
> Get rid of the extra quotes. ie:
> p2 = Popen(['find', '445'], stdin = p1.stdout, stdout = PIPE)
>
> The quotes on the command line and on the os.system call are consumed
> by the shell. The program doesn't see them.
You must be a linux user:)
I guess, in windows, the quotes are consumed by the c runtime library.
Mayby the "find" in windows doesn't use the argc/argv but the windows
API GetCommandLine().
I wrote a c program to prove it.
#include
#include
int main(int argc, char **argv) {
int i;
printf("%s\n", GetCommandLine());
for (i = 0; i < argc; ++i)
printf("%d: %s\n", i, argv[i]);
return 0;
}
The output is:
C:\>test 1 2 "3"
test 1 2 "3"
0: test
1: 1
2: 2
3: 3
C:\>
Notice that, GetCommandLine() does not consume the quotes, but the
(char **argv) does.
--
http://mail.python.org/mailman/listinfo/python-list
Re: how to use subprocess.Popen execute "find" in windows
On 5月8日, 下午5时39分, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote:
> En Wed, 07 May 2008 23:29:58 -0300, <[EMAIL PROTECTED]> escribió:
>
>
>
> > On 5月7日, 上午9时45分, Justin Ezequiel <[EMAIL PROTECTED]>
> > wrote:
> >> On May 6, 5:19 pm, [EMAIL PROTECTED] wrote:
>
> >> > p1 = Popen(['netstat', '-an'], stdout = PIPE)
> >> > p2 = Popen(['find', '"445"'], stdin = p1.stdout, stdout = PIPE)
> >> > print p2.stdout.read()
>
> >> > It doesn't work.
> >> > Because subprocess.Popen execute "find" like this.
>
> >> > C:\>find \"445\"
>
> >> > It adds a '\' before each '"'.
> >> > How to remove the '\'?
> >> > Thank you.
>
> >> cannot help with the backslashes but try findstr instead of find
>
> > Thank you.
> > findstr doesn't need quotes, so it works.
>
> Build the command line yourself -instead of using a list of arguments-. Popen
> doesn't play with the quotes in that case:
>
> p1 = Popen(['netstat', '-an'], stdout = PIPE) # using list
> p2 = Popen('find "445"', stdin = p1.stdout, stdout = PIPE) # using str
> print p2.communicate()[0]
>
> --
> Gabriel Genellina
Thanks very much.
You solved my problem.
--
http://mail.python.org/mailman/listinfo/python-list
