how to use subprocess.Popen execute "find" in windows

C

clyfish

In cmd, I can use find like this.

C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

C:\>

And os.system is OK. TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.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.
 
D

Diez B. Roggisch

In cmd, I can use find like this.

C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

C:\>

And os.system is OK.
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*
0

But I don't know how to use subprocess.Popen to do this.

While there certainly are valid usecases for piping with subprocess in
Python - this ain't one I'd say. Just read the output of netstat yourself,
and filter for lines that contain the desired pattern.

Diez
 
B

BlueBird

In cmd, I can use find like this.

C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

C:\>

And os.system is OK.>>> import os
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.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()

I would say that, according to documentation, the following should
work:
print p2.communicate()[0]


Philippe
 
J

Justin Ezequiel

In cmd, I can use find like this.

C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

C:\>

And os.system is OK.>>> import os
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.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
 
A

alito

In cmd, I can use find like this.

C:\>netstat -an | find "445"
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  UDP    0.0.0.0:445            *:*

C:\>

And os.system is OK.>>> import os
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  UDP    0.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.
 
C

clyfish

In cmd, I can use find like this.
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

And os.system is OK.>>> import os
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.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\"
¾Ü¾ø·ÃÎÊ - \

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.
 
C

clyfish

In cmd, I can use find like this.
C:\>netstat -an | find "445"
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.0.0.0:445 *:*

And os.system is OK.>>> import os
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
UDP 0.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 <windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
int i;

printf("%s\n", GetCommandLine());
for (i = 0; i < argc; ++i)
printf("%d: %s\n", i, argv);

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.
 
G

Gabriel Genellina

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]
 
C

clyfish

En Wed, 07 May 2008 23:29:58 -0300, <[email protected]> escribi¨®:


On May 6, 5:19 pm, (e-mail address removed) 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]

Thanks very much.
You solved my problem.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,053
Latest member
BrodieSola

Latest Threads

Top