मैं उद्देश्य-सी से Ubutu वन एपीआई का उपयोग करने के लिए एक पायथन लाइब्रेरी बनाने की कोशिश कर रहा हूं। https://github.com/JoseExposito/U1-Finder-Plugin/blob/master/U1FinderLib/U1FinderLib.pyएक धागे में twisted reactor.run() निष्पादित करें?
मैं इस कारण मैं अपने रिएक्टर रन की एक बार के बजाय यह चल रहा है और यह उबंटू एक दस्तावेज के उदाहरण में बंद करो, की तरह करने की जरूरत के लिए, एपीआई के लिए कई कॉल करने के लिए की जरूरत है: यहाँ मेरी स्रोत कोड है : https://one.ubuntu.com/developer/files/store_files/syncdaemontool
क्योंकि यह संभव दो बार रिएक्टर को चलाने के लिए ... नहीं है और मैं() reactor.run निष्पादित करने के लिए एक सूत्र में क्योंकि मुझे लगता है कि पुस्तकालय का उपयोग करता है आवेदन नहीं रोक सकते हैं की जरूरत है!
ऐसा करना संभव है? मैं एक थ्रेड में रिएक्टर चलाने में सक्षम नहीं हूं और उबंटू वन एपीआई सिंक्रोनस को कॉल करता हूं।
संपादित करें:
मैं विचार का परीक्षण करने के लिए इस सरल स्रोत कोड का उपयोग कर रहा:
#!/usr/bin/env python
import objc
import thread
import os
import time
from twisted.internet import reactor, defer
from ubuntuone.platform.tools import (SyncDaemonTool, is_already_running)
from threading import Thread
NSObject = objc.lookUpClass('NSObject')
##
# Variable to get the result of the calls to the Sync Daemon.
# The result is a JSON string stored in returned_value[0].
returned_value = ['']
##
# Objective-C facade to the methods of the U1FinderLib.
class U1FinderLib(NSObject):
def init(self):
self = super(U1FinderLib, self).init()
self.sync_daemon_tool = SyncDaemonTool(None)
Thread(target=reactor.run, args=(False,)).start()
return self
@objc.typedSelector('@@:')
def volumeList(self):
print "Begin volumeList"
reactor.callLater(0, run_command, "volume_list", [], self.sync_daemon_tool)
print "End volumeList"
return returned_value[0]
##
# Auxiliar functions to call to the sync daemon.
@defer.inlineCallbacks
def run_command(action, params, sync_daemon_tool):
print "run_command"
running = yield is_already_running()
print "After is_already_running"
try:
if not running:
returned_value[0] = '{ type:"error" reason:"Sync Daemon is not running" }'
else:
print "Before run_action"
yield run_action(action, params, sync_daemon_tool)
print "After run_action"
except Exception, e:
returned_value[0] = '{ type:"error" reason:"Exception: %s" }' % e
@defer.inlineCallbacks
def run_action(action, params, sync_daemon_tool):
if action == "volume_list":
d = sync_daemon_tool.get_folders()
returned_value[0] = yield d.addCallback(lambda r: volume_list(r))
# Volume List
def volume_list(folders):
volumes_json = '{ type:"volume_list" volumes: { \n\t{ volume:"' + os.path.expanduser('~/Ubuntu One') + '" subscribed:"YES" }'
for folder in folders:
volumes_json += ',\n\t{ volume:"' + folder['path'] + '" subscribed:"' + ('YES' if bool(folder['subscribed']) else 'NO') + '" }'
volumes_json += '\n} }'
return volumes_json
if __name__ == '__main__':
py = U1FinderLib.alloc().init()
print py.volumeList()
print "EXIT"
और इस कार्यक्रम का उत्पादन होता है:
Begin volumeList
End volumeList
EXIT
समस्या यह है कि है "run_command" फ़ंक्शन को कभी भी
आप हमेशा अपने कार्यों को डिफ्रेंड के रूप में पंजीकृत कर सकते हैं, उन्हें रिएक्टर # –
के माध्यम से आग लग सकते हैं क्या आप इसे थोड़ा सा समझा सकते हैं? मैं पाइथन पूरी तरह से नोब हूं (वास्तव में यह पायथन में मेरा पहला कोड है) – user1204395
पायथन में पहली बार प्रोग्रामिंग और सीधे मुड़ने पर कूदते हैं? मैं आपको सभी भाग्य की कामना करता हूं ... :) –