2011-06-26 26 views
7

Tôi đang sử dụng thư viện cung cấp giao diện python cho một chương trình bên ngoài. Điều này cho phép tôi tạo:Python: cách chia sẻ một cá thể đối tượng trên nhiều lời gọi của một tập lệnh

foo = Foo() 

Mã trên bắt đầu một phiên bản mới của chương trình Foo mà tôi có thể kiểm soát từ trong python.

Tôi có một tập lệnh python cần được gọi nhiều lần và tùy thuộc vào tham số bên ngoài, cho biết một trường hợp đơn lẻ của chương trình Foo bên ngoài để thực hiện những việc khác nhau. Rõ ràng tôi không thể làm

foo = Foo() mọi,

kể từ đó tạo ra một thể hiện mới của Foo mỗi khi kịch bản của tôi chạy.

Điều tôi muốn làm là tạo foo= Foo() một lần và có nhiều yêu cầu chia sẻ cùng một phiên bản. Hiện tại tôi đang suy nghĩ về việc tạo ra nó một lần, tuần tự hóa nó, và có kịch bản của tôi deserialize nó. Cách tiếp cận này có hiệu quả không? Có một lựa chọn tốt hơn?

Cảm ơn !!

Trả lời

3

Điều này có thể được thực hiện nếu bạn làm theo một cách tiếp cận tương tự như được nêu trong this answer. Hoặc bạn có thể sử dụng Pyro, được so sánh với đa xử lý trong this answer.

0

Bạn có thể sử dụng pickle. Dưới đây là một ví dụ đơn giản:

import os, pickle 

class Foo(object): 
    def __init__(self, bar): 
     self.bar = bar 

# use previous pickled instance if found 
if os.path.exists('foo.pickle'): 
    with open('foo.pickle') as f: 
     foo = pickle.load(f) 
else: 
    foo = Foo(42) 

# print current foo.bar 
print foo.bar 

# change foo.bar and pickle 
foo.bar = raw_input('new bar: ') 
with open('foo.pickle', 'w') as f: 
    pickle.dump(foo, f) 
+0

Tôi đã thử thực hiện điều đó, tôi nhận được một thông báo nói rằng "Không thể chọn 'khóa' đối tượng: ". Tôi đang xem xét nó ngay bây giờ. – wk1989

+0

Vâng, nó có những hạn chế mà bạn có thể/không thể làm việc xung quanh để làm những gì bạn muốn: http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled – zeekay

+2

nếu bạn đang sử dụng khóa, bạn có thể cần phải thực hiện một đường dẫn khác như ổ cắm hoặc đường ống để cung cấp quyền truy cập bị khóa cho lớp học của bạn – lunixbochs

0

Bạn có thể thay đổi thiết kế để Foo() chỉ kết nối bạn với một quá trình hiện có, và sau đó bạn tạo một hàm mới, gọi nó là startFoo() mà trước đây bạn gọi một lần (hoặc nếu Foo() thất bại) . Thậm chí tốt hơn là làm cho chương trình mà Foo() kết nối với một dịch vụ mà bạn kết nối với trên một ổ cắm. Bạn cũng có thể chỉ muốn chuyển sang mô-đun đa xử lý.

+0

Vâng. Tôi nghĩ đó là những gì tôi sẽ phải xem khi tôi không thể sắp xếp hàng loạt đối tượng Foo dễ dàng. – wk1989

Các vấn đề liên quan