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" > > 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 > > >>> os.system('netstat -an | find "445"') > > > 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[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