python之子程序input問題及解決方法

2021-10-06 14:26:58 字數 1845 閱讀 6620

python子程序中不能input的問題

在python中,子程序是不能使用input操作的,但是有時候需要在子程序中輸入資料,下面將介紹一種方法,解決這個問題

fn=sys.stdin.fileno()
fileno() 方法返回乙個整型的檔案描述符(file descriptor fd 整型),可用於底層作業系統的 i/o 操作。

在主程序中使用該**,返回檔案的描述符

sys.stdin=os.fdopen(fn)
在子程序中開啟標椎的輸入,然後就可以執行input操作了

其他輸入:

sys.stdin.fileno()

0 sys.stdout.fileno()

1 sys.stderr.fileno()

2

分別對應標準輸入、標準輸出、標椎錯誤

案例:tcp的子程序實現多執行緒的雙向通訊

import socket

import os,sys

from multiprocessing import process

from threading import thread

def close(cliensocket,clientaddr):

cliensocket.close()

def runclient(clientsocket,clientaddr):

while true:

try:

data = clientsocket.recv(1024)

if data.decode("gbk") =='':

close(clientsocket,clientaddr)

break

print(data.decode("gbk"))

except exception as e:

print("faile")

close(clientsocket)

break

def sendclient(clientsocket,clientaddr):

while true:

srv = input()

clientsocket.send(srv.encode("gbk"))

def client(clientsocket,clientaddr,fn):

sys.stdin = os.fdopen(fn)

h1 = thread(target=sendclient,args=[clientsocket,clientaddr])

h1.start()

h2 = thread(target=runclient,args=[clientsocket,clientaddr])

h2.start()

def main():

fn = sys.stdin.fileno()

s = socket.socket(socket.af_inet,socket.sock_stream)

s.bind(("",8888))

s.listen()

try:

while true:

clientsocket,clientaddr = s.accept()

task = process(target=client,args=[clientsocket,clientaddr,fn])

task.start()

finally:

s.close(clientsocket,clientaddr)

if __name__=='__main__':

main()

Python實戰之子程序

最近做乙個小工具需要用到python的字程序,看了一下python的api,subprocess模組可以就可以實現,並且還挺簡單 要實現乙個簡單的自程序,只需要 此時,pid將是子程序的id號,如果子程序正常推出,returncode將會是none。也可以使用以下 建立子程序 此時,如果子程序正常推...

Python實戰之子程序

最近做乙個小工具需要用到python的字程序,看了一下python的api,subprocess模組可以就可以實現,並且還挺簡單 要實現乙個簡單的自程序,只需要 import sys,os,subprocess p subprocess.popen ls l shell false,stdin no...

Python實戰之子程序

最近做乙個小工具需要用到python的字程序,看了一下python的api,subprocess模組可以就可以實現,並且還挺簡單 要實現乙個簡單的自程序,只需要 import sys,os,subprocess p subprocess.popen ls l shell false,stdin no...