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

python - Hoạt động đọc/ghi tệp đồng thời từ các quy trình khác nhau: hoạt động trên Windows nhưng không hoạt động trên Linux

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 01:13:24 25 4
mua khóa gpt4 Nike

Tôi đang tạo cơ sở dữ liệu SQLite bằng cách sử dụng dữ liệu từ tệp .log. Tệp nhật ký được cập nhật mỗi khi máy thực hiện một thao tác. Những gì tôi làm trong Windows là theo dõi các thay đổi của tệp này sau khi nó được sửa đổi - bên ngoài bởi máy thông qua giao tiếp nối tiếp, nhưng tôi mô phỏng hành vi này bằng cách mở tệp trong Notepad và thêm dòng mới - Đọc hàng mới và đưa dữ liệu vào cơ sở dữ liệu .

Vấn đề là khi tôi cố gắng làm điều tương tự trên máy Linux của mình vì rõ ràng chương trình python không thấy bất kỳ sửa đổi nào trong tệp ngay cả sau khi cập nhật và lưu. Tuy nhiên, nếu tôi đóng và mở lại tệp trong chương trình để đọc lại thì các sửa đổi vẫn ở đó (nhưng tôi vẫn không thể phát hiện các sửa đổi mới).

Tôi thực sự đã thử nghiệm mã tương tự trên Raspberry Pi 3 B+ chạy Raspbian và nó hoạt động như mong đợi: đã phát hiện thấy các sửa đổi,tote de suite và thêm dữ liệu vào cơ sở dữ liệu.

Định dạng của tệp .log như sau.

01 (PB) 008 Pa 6,01 thanh 11/12/2055 07:25:17    
01 (PB) 008 Pa 6,01 thanh 11/12/2055 07:26:39
01 (PB) 009 Pa 6,00 thanh 11/12/2055 07:29:45

这是我使用的代码:

import re
nhập sqlite3
nhập hệ điều hành, thời gian

nếu __name__=='__main__':
fd = open('putty.log', 'r')

# Ici on crème la base de données qui gardera les resultats des test

kết nối = sqlite3.connect('banc_tests.db')
con trỏ = kết nối.cursor()

tạo_db = """
TẠO bảng kiểm tra (
tham chiếu VARCHAR(15),
num_serie VARCHAR(15),
hoạt động TINYINT,
kết quả CHAR(2),
nhỏ,
hợp nhất VARCHAR(5),
áp lực FLOAT,
pUnite VARCHAR(5),
ngày NGÀY,
thời gian THỜI GIAN
);
"""

con trỏ.execute(create_db)

# Ở đây chúng ta tìm định dạng của khung ngân hàng thử nghiệm với các biểu thức chính quy
# Hiện tại chúng tôi đang bỏ qua tất cả thông tin về áp suất thấp, kiểm tra PE, v.v.

trong khi 1:
ở đâu = fd.tell() # Garde la location actuelle du curur dans le fichier
line = fd.readline() # Bật sáng la ligne suivante
nếu không phải dòng:
thời gian.ngủ(1)
fd.seek(where) #Si il n'y a rien à lire on retourne à la location précédente.
khác:
# Đoạn ([\+\-]?\d*)\s*(\w*) nhằm mục đích bỏ qua các khoảng trắng trong các dòng kiểm tra bị lỗi
# cũng như để lấy áp suất rò rỉ cho các thử nghiệm thông thường.
# phiên bản, chỉ cần thay thế mọi * bằng +.
in (dòng)
đã tìm thấy = re.findall(r'^\s+(\d+)\s+\((\w+)\)\s+([\+\-]?\d*)\s*(\w*)\s+( \d+\.?\d+)\s+(\w+).*\s(\d+)/(\d+)/(\d+)\s+(\d+:\d+:\d+)', dòng)

#La commande find all retourne une tuple dans une liste, donc ici j'enlève la tuple et laisse
# Juste la liste avec les éléments dedans.

nếu tìm thấy:
tạm thời = danh sách (đã tìm thấy [0])

chèn_values ​​= """
CHÈN VÀO các bài kiểm tra (tham chiếu, num_serie, hoạt động, resultat, fuite, unity, pression, pUnite, ngày, giờ)
GIÁ TRỊ ("{ref}", "{num_ser}", "{op}", "{res}", "{fuite}", "{unt}", "{pression}", "{pUnt}", "{ngày}", "{thời gian}"); """

Insert_command = Insert_values.format(ref='', num_ser='', op=temp[0], res=temp[1], fuite=temp[2], unt=temp[3], pression=temp[4] , pUnt=temp[5], date='{}-{}-{}'.format(temp[8], temp[7], temp[6]), time=temp[9])
con trỏ.execute(insert_command)

kết nối.commit()

Tôi nghĩ đó là vấn đề với hành vi chặn của hàm open(), vì vậy tôi đã thử đặt os.O_NONBLOCK biểu tượng với fcntl tuy nhiên, được sử dụng cùng nhau, nó không hoạt động.

Có ai biết nguyên nhân gây ra hành vi khác nhau này giữa Linux (Debian 10 Bluster) và Windows không? Tôi có thể làm gì để giải quyết vấn đề về phía Linux?

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

Tôi đã thực hiện một số nghiên cứu và tìm thấy vấn đề. Điều này là do sau khi lưu tệp trong trình chỉnh sửainodeCó điều gì đó đã thay đổi.

Bạn có thể sử dụng vim và thiết lập đặt bản sao lưu = có để ngăn chặn hành vi này ( http://vimdoc.sourceforge.net/htmldoc/options.html#'backupcopy' )

Để quan sát hành vi này, bạn có thể sử dụng ls -li, nó sẽ hiển thị cho bạn tệp inode.

pawel@pawel-XPS-15-9570:~/test$ ls -li putty.log 
10263515 -rw-r--r-- 1 pawel pawel 87 wrz 5 14:10 putty.log
pawel@pawel-XPS-15-9570:~/test$ echo 'test' >> putty.log
pawel@pawel-XPS-15-9570:~/test$ ls -li putty.log
10263515 -rw-r--r-- 1 pawel pawel 92 wrz 5 14:14 putty.log
pawel@pawel-XPS-15-9570:~/test$ vim putty.log
pawel@pawel-XPS-15-9570:~/test$ ls -li putty.log
10263513 -rw-r--r-- 1 pawel pawel 97 wrz 5 14:14 putty.log
pawel@pawel-XPS-15-9570:~/test$

Cột đầu tiên làinode. Như bạn có thể thấy sau khi chỉnh sửa vim, nó đã thay đổi, đó là lý do tại sao tập lệnh của bạn không thấy các thay đổi (vì trình chỉnh sửa đã ghi đè tệp).

Về python - Hoạt động đọc/ghi tệp đồng thời từ các quy trình khác nhau: hoạt động trên Windows nhưng không hoạt động trên Linux, 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/57800994/

25 4 0
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