码迷,mamicode.com
首页 > 编程语言 > 详细

Python 3 运行 shell 命令

时间:2017-05-02 13:52:43      阅读:1474      评论:0      收藏:0      [点我收藏+]

标签:line   process   [1]   http   tde   python   highlight   ==   write   

#python 3.5 , win10

 

引入包

#os.chdir(‘path‘)

import os
import subprocess

#https://docs.python.org/3.5/library/subprocess.html?highlight=subprocess#module-subprocess

#http://ltp.readthedocs.io/zh_CN/latest/ltptest.html

 

Run 1 process

 

p1 = subprocess.Popen(‘cws_cmdline --input input_file.txt ‘,stdout=subprocess.PIPE,stderr=subprocess.PIPE [,universal_newlines=True])

#p1 = subprocess.Popen([‘cws_cmdline‘,‘--input‘, ‘input_file.txt ‘],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

#universal_newlinews 为 True 时,输入为 str 流,(默认)为 False 时为 byte 流

output_10 = p1.communicate()[0]  #stdin
output_11 = p1.communicate()[1]  #stderr

 

Run pipe-line

 

p1 = subprocess.Popen(‘cws_cmdline --input input_file.txt ‘,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

p2 = subprocess.Popen(‘pos_cmdline --input no_file.txt ‘,stdin=p1.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

p3 = subprocess.Popen(‘ner_cmdline --input no_file.txt ‘,stdin=p2.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

#if call p1|2.communicate()[0|1] before p3.communicate(), pipeline will break at p1|p2, because the before stdout|stderr pipe will be extract and not use anymore

#if call p1|2.communicate()[0|1] before p3 = constructor,  will get ValueError: I/O operation on closed file

output30 = p3.communicate()[0]  #stdout
output31 = p3.communicate()[1]  #stderr

#if call p1|2.communicate()[0|1] after p3.communicate(), will get close warning.

 

‘‘‘  def communicate(self, input=None, timeout=None):

#...

            if self.stdin:
                self._stdin_write(input)
            elif self.stdout:
                stdout = self.stdout.read()
                self.stdout.close()
            elif self.stderr:
                stderr = self.stderr.read()
                self.stderr.close()
            self.wait()

#...

‘‘‘

Run process one by one

 

#px.communicate()  actually run the pipe line until px, all the pipe content(p1&p2&p3.stdin&stdout&stderr pipe) will be extract and not usable any more .

#if you want to save each pipe line node‘s meadian content , you need to use a new pipe as   stdin=subprocess.PIPE , and use  communicate(‘input Popen‘s stdin content‘)

 

p1 = subprocess.Popen(‘cws_cmdline --input input_file.txt ‘,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

output_10 = p1.communicate()[0]
output_11 = p1.communicate()[1]

str_10 = output_10.decode(‘utf-8‘)

str_11 = output_10.decode(‘utf-8‘)

p2 = subprocess.Popen(‘pos_cmdline --input no_file.txt ‘,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

#communicate(‘input Popen‘s stdin content once if and only if stdin==subprocess.PIPE‘)

output_20 = p2.communicate( bytes(str_10, encoding = ‘utf-8‘) )[0]
output_21 = p2.communicate()[1]

# for px.communicate(), only the first time call can you set the input

#or use  "universal_newlines=True" for Popen() to process str stream

p3 = subprocess.Popen(‘ner_cmdline --input no_file.txt ‘,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

output_3 = p3.communicate( output20)
[output_30, output_31] = output_3

 

Python 3 运行 shell 命令

标签:line   process   [1]   http   tde   python   highlight   ==   write   

原文地址:http://www.cnblogs.com/squirrel2300/p/6795435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!