Python 3 運行 shell 命令

來源:互聯網
上載者:User

標籤: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 命令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.