現在、パイプとソケットの両方を利用する基本的な python スクリプトを作成中です。パイプは現在、html フォームからの受信データを保持し、ソケットはさまざまな間隔で TCP/IP コマンドを送信するサーバーへの接続を確立します。フォームとサーバーは同じ LAN 上にありますが、コンピューターは異なります。
私が持っているコードは次のとおりです。
#!/usr/bin/env python
import os,sys,time
from socket import *
HOST = 'xxx.xxx.xxx.xxx'
PORT = 6000
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
count = 0
pipe_name = 'testpipe'
if not os.path.exists(pipe_name):
os.mkfifo(pipe_name)
def readpipe():
pipein = open(pipe_name, 'r')
line = pipein.readline()[:-1]
print line
pipein.close()
def readTCP():
data = tcpCliSock.recv(BUFSIZ)
print data
while count == 0:
readTCP()
readpipe()
カウント変数が現在冗長であることを認識しています。これを使用して、以前の問題をいくつか試してデバッグしています
ご覧のとおり、コードは非常に単純で、データが最初にパイプで、次にソケットで受信され、このパターンが維持される限り機能します。問題は、両方の機能を動的に実行していないことです。ソケットのいずれかのパイプで入力を待っている間にハングします。パイプまたはソケットのいずれかにデータが存在しないかどうかを識別する方法を見つけようとしています。その後、オフにしてもう一方をチェックできます。これまでに試したことはすべて、空の文字列をチェックするなどの効果がありませんでした。
次の投稿でいくつかの興味深いものを見つけましたが、(stdin を使用して) 私が行っていることとはかなり異なるように思われるため、それが本当に探しているものなのか、それとも適応できるのかわかりません。
Python プログラムがstdinから読み取るものがあるかどうかを確認する最良の方法は何ですか? を参照してください。
「ユーザー」のアドバイスに続いて、少し追加のコードをまとめました。
while True:
inputdata,outputdata,exceptions = select.select([tcpCliSock],[],[])
if tcpCliSock in inputdata:
data = tcpCliSock.recv(BUFSIZ)
print data
これは機能しますが、パイプの入力データにどの識別子を入れるかを見つけることができませんでした。私は選択モジュールを読みましたが、どうやらパイプで動作するようですが、それに関する情報はほとんどないようです。それはすべてネットワーク化されたものです。私は次のことを試しました(上記のメインコードから取得):
testpipe
pipe_name
pipein
しかし、さまざまなエラーが発生しますが、そのほとんどはNameError に関連しています - 未定義またはTypeError: 引数は int である必要があるか、fileno() メソッドが必要です