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...