Using subprocess in python 3

匆匆过客 提交于 2020-07-17 16:04:14

问题


I was using the subprocess module to run the shell command in python 3.
Here is my code

import subprocess
filename = "somename.py"  # in practical i'm using a real file, this is just for example
subprocess.call("pep8 %s" % filename, shell=True)) 

The output for different files is just 0 or 1. I am quite new to python 3. Using this in 2.7 gives me the desired output, but here i am not able to figure it out.
This is the output i get in python 2.7 (for a file named - anu.py ) -

anu.py:2:1: W191 indentation contains tabs
anu.py:3:1: W191 indentation contains tabs
anu.py:3:7: E228 missing whitespace around modulo operator
anu.py:4:1: W191 indentation contains tabs
anu.py:5:1: W191 indentation contains tabs
anu.py:6:1: W191 indentation contains tabs
anu.py:7:1: W191 indentation contains tabs
anu.py:7:9: E231 missing whitespace after ','
anu.py:8:1: W191 indentation contains tabs
anu.py:9:1: W191 indentation contains tabs
1

Please help me guys. Thanks

Update:
I tried using subprocess.check_output method,
Here is the ouput i got,

>>> subprocess.check_output(["pep8", "anu.py"])
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "X/subprocess.py", line 584, in check_output
it too will be used internally.  Example:
subprocess.CalledProcessError: Command '['pep8', 'anu.py']' returned non-zero exit status 1

回答1:


subprocess.call only returns the exit code of the process it ran. Normally I'd recommend using subprocess.check_output, which will return the actual output of the subprocess. However, in your particular case, pep8 will return a non-zero exit code in some cases, which will make check_output raise an exception. You can catch the exception and extract the output attribute from it:

try:
    output = subprocess.check_output(['pep8', 'anu.py'])
except subprocess.CalledProcessError as e:
    output = e.output

Or just use subprocess.Popen directly:

p = subprocess.Popen(['pep8', 'anu.py'], stdout=subprocess.PIPE)
(output, _) = p.communicate()

Note that the call behavior hasn't changed between Python 2.x and Python 3.x. The difference in behavior you're seeing might be because you're running Python 2.7 in an interactive prompt, but running the Python 3 version as an actual script. Using subprocess.call in the interactive prompt will still end up printing the output of the call, even though it's not actually being returned by the function.



来源:https://stackoverflow.com/questions/24050884/using-subprocess-in-python-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!