在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ python如何分別向兩個(gè)cmd窗口輸入指令?

python如何分別向兩個(gè)cmd窗口輸入指令?

1.用python打開了另一個(gè)py文件,這時(shí)候就有了兩個(gè)cmd黑窗(一個(gè)是主函數(shù)本身的cmd窗口,另一個(gè)是調(diào)用文件打開的窗口),那么,問題來了,我怎么樣才能向后面打開的這個(gè)窗口輸入指定,比如exit退出這個(gè)cmd窗口。

2.部分代碼如下:

def childprocess():
        subprocess.call('factory_test.py')
def killprocess():
        p = os.system('exit')

3.這個(gè)killprocess函數(shù),會(huì)在當(dāng)前主函數(shù)下下發(fā),把整個(gè)函數(shù)都退了出來,很郁悶。
另外Popen.kill因?yàn)閮蓚€(gè)函數(shù)并列,還用不了。

回答
編輯回答
尐懶貓

如果只是想完全退出子進(jìn)程,可以使用 psutil:

import subprocess
import psutil

def kill(proc_pid):
    process = psutil.Process(proc_pid)
    for proc in process.children(recursive=True):
        proc.kill()
    process.kill()

proc = subprocess.Popen(["infinite_app", "param"], shell=True)
try:
    proc.wait(timeout=3)
except subprocess.TimeoutExpired:
    kill(proc.pid)

更多關(guān)于如何關(guān)閉 subprocess 進(jìn)程的信息,參考這里。
如果在命令執(zhí)行后還想在子進(jìn)程下繼續(xù)執(zhí)行一些命令,推薦使用 Popen.communicate()
不過要注意 communicate() 只能執(zhí)行一次,再次執(zhí)行就會(huì)有錯(cuò)誤:
ValueError: Cannot send input after starting communication
所以想執(zhí)行多命令可以先把命令組合成一個(gè),再傳進(jìn)去:

from subprocess import Popen, PIPE, STDOUT

process = Popen(["powershell"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
commands = ("python --version\n"
            "activate py34\n"
            "python --version\n")
            # 注意每條命令后的新行符 \n
outs, errs = process.communicate(commands.encode("utf-8"))
content = [z.strip() for z in outs.decode("utf-8").split("\n") if z]
print(*content, sep="\n")

輸出內(nèi)容:

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS E:\Program\My Code> python --version
Python 3.6.2 :: Anaconda, Inc.
PS E:\Program\My Code> activate py34
Activating environment "py34..."
[py34] PS E:\Program\My Code> python --version
Python 3.4.5 :: Continuum Analytics, Inc.
[py34] PS E:\Program\My Code>

其實(shí)還可以用 Popen.stdin.write(),但這是 Python 文檔里不推薦的,因?yàn)楹苋菀讓?dǎo)致死鎖:

process = Popen(["powershell"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
commands = [
    "python --version",
    "activate py34",
    "python --version"
]
for cmd in commands:
    process.stdin.write((cmd + "\n").encode("utf-8"))
    process.stdin.flush()
for line in iter(process.stdout.readline, ""):
    print(line.strip().decode("utf-8"))

輸出類似如上。

2017年7月17日 08:23