cuốn sách gpt4 ai đã làm

trăn - Linux. Trăn. Đọc từ một đường ống có tên

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:33:03 27 4
mua khóa gpt4 Nike

Tôi gặp sự cố khi sao chép một số chức năng trong python.
Hoạt động trên Ubuntu.
Tôi có một chương trình C++ thực hiện một số việc mà thỉnh thoảng nó ghi dữ liệu được định dạng vào một đường ống có tên. Tôi cũng có chương trình C++ đọc dữ liệu từ ống có tên này. Không có vấn đề gì ở đó. Tuy nhiên tôi hầu như không biết làm thế nào để sao chép điều tương tự trong python (chỉ phần đọc).

Đây là mã C++ tôi sử dụng để đọc:

// bao gồm khác nhau
#define FIFO_NAME "/tmp/MYFIFO"

using namespace std;

int main()
{
int fp;
fp = open(FIFO_NAME, O_RDONLY);
char readbuf[80];
while (true)
{
int tot = 0;
//đọc int để biết hiện tại có bao nhiêu kết quả cần đọc
while(tot<>
tot+= read(fp, readbuf+tot, sizeof(int)-tot);
int nres = *(int *)&readbuf[0];
nếu (nres>0)
{
cout << nres << " kết quả:" << endl;
cho (int i = 0; i < nres; i++)
{
// ở đây tôi đọc được 3 float
}
}
}
}

Mã C++ này hoạt động chính xác như tôi muốn: nó đọc byte từ ống được đặt tên, chuyển đổi chúng thành các số tương ứng và cung cấp chúng cho tôi.
Tôi đã thử làm điều tương tự trong python nhưng không thành công.
Đầu tiên hãy thử với mã Python:

hệ điều hành nhập khẩu
import time

FIFO_NAME = '/tmp/MYFIFO'

chắc chắn chính():
fp = os.open(FIFO_NAME, os.O_RDONLY)
while True:
thời gian.ngủ (0,001)
#Ở đây mình chỉ thử đọc 4 byte đầu tiên (int ban đầu) và thất bại rồi
line = os.read(fp, 4) #Tôi nghĩ cái này sẽ đọc 4 byte từ FIFO?
print(len(line)) #ALWAYS print 4
print(line) #ALWAYS in một dòng trống
print(int(line)) #this tất nhiên có lỗi, nói rằng dòng đó ==''

Lần thử thứ hai với mã python (cho kết quả lỗi tương tự):

hệ điều hành nhập khẩu
import time

FIFO_NAME = '/tmp/MYFIFO'

chắc chắn chính():
fp = open(FIFO_NAME, 'r')
while True:
thời gian.ngủ (0,001)
#Ở đây tôi cố gắng đọc đến hết dòng
line = fp.readline() #Tôi nghĩ rằng điều này sẽ đọc đến dấu ngắt dòng, nhưng thực tế nó sẽ trả về ngay lập tức
print(len(line)) #sau vài lần lặp đầu tiên, nó luôn in 6
print(line) #ALWAYS in một dòng trống

Trong lần thử thứ hai, tôi mong đợi dòng mới đầu tiên sẽ được đọc (tôi có thể dễ dàng yêu cầu nhà sản xuất C++ đặt một dòng mới vào cuối mỗi "gói"). Tuy nhiên, điều này luôn đọc các dòng trống.

Câu hỏi của tôi là về chức năng trong python mà tôi có trong C++. Tôi có thể thấy điều này xảy ra theo hai cách:

  • Đã sửa cách tôi sử dụng các đường dẫn ở phía Python bằng cách thực sự đọc các byte và mã hóa các byte đó thành kiểu dữ liệu và giá trị chính xác như trong C++.
  • Yêu cầu python "tải" bộ đệm byte cho đến khi nhận được dòng mới, sau đó trích xuất số của tôi từ đó.

Dù thế nào đi nữa, tôi cũng không hiểu tại sao việc đọc và đọc dòng lại trả về những chuỗi trống đó và cũng không hiểu phải làm gì với chúng.

Mong mọi người có thể giúp đỡ tôi. Xin vui lòng yêu cầu làm rõ và biết thêm thông tin.

câu trả lời hay nhất

Trong bình luận của tôi, tôi đã đề cập đến python, nhưng nhân tiện, đó là điều bình thường.
Hãy xem cái này, nó có thể hữu ích cho bạn vì nó đặc biệt về "Ống được đặt tên giữa C# và Python".
http://jonathonreinhart.blogspot.co.uk/2012/12/named-pipes-between-c-and-python.html

Nếu liên kết bị mất, đây là những gì Jonathan đã nói:

C#

// Mở pipe có tên.
máy chủ var = new NamedPipeServerStream("NPtest");

Console.WriteLine("Đang chờ kết nối...");
máy chủ.WaitForConnection();

Console.WriteLine("Đã kết nối.");
var br = new BinaryReader(server);
var bw = new BinaryWriter(server);

while (true) {
thử {
var len = (int) br.ReadUInt32(); // Đọc độ dài chuỗi
var str = new string(br.ReadChars(len)); // Đọc chuỗi

Console.WriteLine("Đọc: \"{0}\"", str);

str = new string(str.Reverse().ToArray()); // Chỉ cho vui thôi

var buf = Encoding.ASCII.GetBytes(str); // Lấy mảng byte ASCII
bw.Write((uint) buf.Length); // Ghi độ dài chuỗi
bw.Write(buf); // Viết chuỗi
Console.WriteLine("Đã viết: \"{0}\"", str);
}
bắt (EndOfStreamException) {
break; // Khi client ngắt kết nối
}
}

Console.WriteLine("Máy khách đã bị ngắt kết nối.");
máy chủ.Close();
máy chủ.Dispose();

Python

import time
nhập cấu trúc

f = open(r'\\.\pipe\NPtest', 'r+b', 0)
i = 1

while True:
s = 'Tin nhắn[{0}]'.format(i)
tôi += 1

f.write(struct.pack('I', len(s)) + s) # Viết độ dài str và str
f.seek(0) # EDIT: Điều này cũng cần thiết
print 'Đã viết:', s

n = struct.unpack('I', f.read(4))[0] # Đọc độ dài chuỗi
s = f.read(n) # Đọc str
f.seek(0) # Quan trọng!!!
in 'Đọc:', s

thời gian.ngủ(2)

Trong ví dụ này, tôi đã triển khai một giao thức rất đơn giản trong đó mỗi "thông báo" là một số nguyên 4 byte (UInt32 trong C#, định dạng gói "I" (un) trong Python), cho biết độ dài của chuỗi sau. Chuỗi là ASCII. Những điều quan trọng cần lưu ý ở đây:

Đối số thứ ba của Pythonopen() có nghĩa là "không có bộ đệm".
Nếu không, nó sẽ mặc định lưu vào bộ đệm dòng, có nghĩa là nó sẽ đợi một ký tự dòng mới trước khi thực sự gửi nó qua đường ống.

Tôi không biết tại sao, nhưng việc bỏ qua seek(0) sẽ dẫn đến IOError #0.
Tôi đã học được điều này thông qua một câu hỏi trên StackOverflow.

Giới thiệu về trăn - Linux. Trăn. Đọc từ một đường ống có tên, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/32560267/

27 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress