python subprocess.Popen vs os.popen Popen and popen are two functions in Python that are used to create a child process and run a command in that process. However, they have some differences and it is important to understand them in order to choose the m

13 浏览
0 Comments

python subprocess.Popen vs os.popen Popen and popen are two functions in Python that are used to create a child process and run a command in that process. However, they have some differences and it is important to understand them in order to choose the m

我试图在我的Python脚本中获取以下shell命令的输出:

hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}

我可以通过os.popen成功获取输出,代码如下:

import os
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = os.popen(cmd,"r")
while 1:
    line = p.readline()
    if not line: break
    print line

但是os.popen()从Python 2.6开始被弃用,所以我想用subprocess.Popen()函数替换上面的代码片段。

但是下面的subprocess.Popen()代码片段的结果与上面的代码片段不同。

import subprocess as sub
import shlex
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
args = shlex.split(cmd)
p = sub.Popen(args,stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

上面的命令只给出了'hadoop fs -ls /projectpath/'部分的输出。

我已经尝试查阅了几个参考资料(http://docs.python.org/2/library/subprocess.html#popen-objectsPython, os.system for command-line call (linux) not returning what it should?),但无法执行字符串cmd中的命令。有人能指出我做错了什么吗?

0
0 Comments

Python中有两种常见的执行外部命令的方法,分别是subprocess.Popen和os.popen。然而,在使用过程中可能会遇到一些问题。本文将探讨使用subprocess.Popen和os.popen时出现的问题以及解决方法。

在上述代码中,使用了subprocess.Popen执行外部命令。然而,可能会出现一些问题,如命令无法执行、输出为空等。下面将分别介绍这些问题的原因和解决方法。

1. 命令无法执行的原因:

a. 命令错误:请确保输入的命令是正确的,并且可以在命令行中执行。

b. 环境变量问题:有时候,命令需要使用特定的环境变量,但是在Python中执行时可能找不到。可以尝试在命令前面加上完整的路径,或者使用subprocess.Popen的env参数设置环境变量。

解决方法:

cmd = "/path/to/hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = sub.Popen(cmd, stdout=sub.PIPE, stderr=sub.PIPE, shell=True)

2. 输出为空的原因:

a. 命令执行错误:命令可能无法正确执行,导致输出为空。可以尝试在命令行中执行,查看是否能够正确输出结果。

b. 子进程错误:可能是由于子进程执行过程中出现了错误,导致输出为空。可以使用p.communicate()获取子进程的输出和错误信息,查看是否有错误发生。

解决方法:

cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = sub.Popen(cmd, stdout=sub.PIPE, stderr=sub.PIPE, shell=True)
output, error = p.communicate()
if output:
    print(output.decode())
else:
    print("No output")

除了使用subprocess.Popen,还可以使用os.popen执行外部命令。但是,os.popen在Python 3中已经被废弃,推荐使用subprocess.Popen。如果仍然需要使用os.popen,可以使用以下解决方法:

import os
cmd = "hadoop fs -ls /projectpath/ | grep ^d | grep -v done | head -1 | awk {'print $8'}"
p = os.popen(cmd)
output = p.read()
p.close()
if output:
    print(output)
else:
    print("No output")

使用subprocess.Popen执行外部命令时可能会遇到命令无法执行和输出为空的问题。解决方法包括检查命令是否正确、设置环境变量、查看子进程错误信息等。同时,建议使用subprocess.Popen代替已经被废弃的os.popen方法。

0