2012-06-27 10 views
5

पर पायथन के साथ यूएसबी पर फ़ाइल लिखें, अगर प्रश्न इतना बेवकूफ है तो मैं क्षमा चाहता हूं लेकिन मैं लिनक्स और पायथन में नया हूं। मुद्दा यह है कि मुझे एक पायथन लिपि लिखनी है जो कनेक्ट यूएसबी स्टिक का पता लगाएगी और इसमें एक फाइल लिख जाएगी। मैं opensuse का उपयोग करता हूं (लेकिन आदर्श मामले में किसी भी लिनक्स distro के साथ स्क्रिप्ट shoild काम)। वर्तमान संस्करण यूएसबी का पता लगा सकता है और अगर वह यूएसबी घुड़सवार हो तो फाइल लिख सकता है। लेकिन मेरी मशीन यूएसबी पर केवल तभी घुड़सवार है जब मैं इसे फ़ाइल मैनेजर में ब्राउज़ करता हूं। जब तक यूएसबी एक पार्टियन के रूप में नहीं मिला लेकिन माउंट प्वाइंट के बिना। तो, मैं सिस्टम को यूएसबी को माउंट करने के लिए कैसे मजबूर कर सकता हूं या मैं देवनाम या देवपाथ या अन्य जानकारी जो मैं हेल मैनेजर से प्राप्त कर सकता हूं, का उपयोग कर फ़ाइल कैसे लिख सकता हूं। मैं उपयोग नहीं कर सकते "माउंट" कमांड है क्योंकि यह एक जड़ अनुमति की आवश्यकता हैलिनक्स

सरलीकृत स्रोत कोड:

import dbus, gobject, os 

class DeviceAddedListener: 
    def __init__(self): 
     self.bus = dbus.SystemBus() 
     self.hal_manager_obj = self.bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") 
     self.hal_manager = dbus.Interface(self.hal_manager_obj, "org.freedesktop.Hal.Manager") 
     self.hal_manager.connect_to_signal("DeviceAdded", self.added) 

    def show(self, name, udi): 
     d_object = self.bus.get_object('org.freedesktop.Hal', udi) 
     d_interface = dbus.Interface(d_object,'org.freedesktop.Hal.Device') 

     if d_interface.QueryCapability("volume"): 
      print name 
      props = [ "block.device", "volume.label", "volume.is_mounted", "volume.mount_point", "volume.size"] 
      for p in props: 
       print '\t', p, " = ", 
       try: 
        print d_interface.GetProperty(p) 
       except: 
        print "Fail" 

    def added(self, udi): 
     self.show("DeviceAdded", udi) 
     self.bus.add_signal_receiver(self.property_modified, 
      "PropertyModified", 
      "org.freedesktop.Hal.Device", 
      "org.freedesktop.Hal", 
      udi, 
      path_keyword = "sending_device") 

    def property_modified(self, numupdates, updates, sending_device = None): 
     self.show("PropertyModified", sending_device) 



if __name__ == '__main__': 
    from dbus.mainloop.glib import DBusGMainLoop 
    DBusGMainLoop(set_as_default=True) 
    loop = gobject.MainLoop() 
    DeviceAddedListener() 
    print "running" 
    loop.run() 

उत्पादन जब USB

DeviceAdded 
block.device = /dev/sdb1 
volume.label = @ 
volume.is_mounted = 0 
volume.mount_point = 
volume.size = 4009722368 

उत्पादन जब यूएसबी प्लग इन है और घुड़सवार में खामियों को दूर

block.device = /dev/sdb1 
volume.label = @ 
volume.is_mounted = 1 
volume.mount_point = /media/@ 
volume.size = 4009722368 

किसी भी मदद के लिए धन्यवाद!

+0

आप 'माउंट' का उपयोग क्यों नहीं कर सकते? यदि 'माउंट 'काम नहीं करता है, तो आपका समाधान क्यों होगा? –

+0

जब मैं माउंट का उपयोग करता हूं तो मेरे पास एक संदेश होता है "माउंट: केवल रूट ही ऐसा कर सकता है" – user1485818

उत्तर

2

आपको mount का उपयोग करना होगा क्योंकि कर्नेल सुरक्षा कारणों से ऑपरेटिंग सिस्टम के भीतर विभाजन को बढ़ाना नियंत्रित करता है। आप सुपरसियर/व्यवस्थापक विशेषाधिकारों के बिना माउंट का उपयोग कर सकते हैं। कुछ इस तरह का प्रयास करें:

सुनिश्चित करें कि निर्देशिका (/mnt/usb1/) आप बढ़ते रहे हैं पहले से मौजूद है करने के लिए सुनिश्चित करें, और उसके बाद

mount /dev/sdb1 /mnt/usb1 -o noauto,users,rw,umask=0 

वहाँ भी कुछ स्वचालित लगाने की अनुमति देने वाला autofs कहा जाता है:

http://linuxconfig.org/automatically-mount-usb-external-drive-with-autofs

+0

धन्यवाद! लेकिन मैं इसे किसी कारण से माउंट नहीं कर सकता। मेरे '/ mnt /' और '/ media /' फ़ोल्डर्स खाली हैं और मैं 'रूट अनुमति' के बिना 'mkdir' कमांड के साथ एक नया फ़ोल्डर नहीं बना सकता - 'mkdir: निर्देशिका नहीं बना सकता'/mnt/usb1 ': अनुमति अस्वीकृत' । बेशक मैं स्क्रिप्ट को जड़ के रूप में चला सकता हूं लेकिन विचार है कि कोई भी उपयोगकर्ता इसे कर सकता है। बस एक स्क्रिप्ट चलाएं, एक यूएसबी में प्लग किया गया है और यह एक फाइल लिख देगा। – user1485818

+0

@ user1485818 आपके पास दो विकल्प हैं: आप कहीं भी '/ mnt' या '/ media' के अलावा इसे आरोहित करने का प्रयास कर सकते हैं, या आपके पास" इंस्टॉल "स्क्रिप्ट हो सकती है जिसे आपकी स्क्रिप्ट सेट अप करने के लिए एक बार रूट पहुंच की आवश्यकता होती है। आप देखेंगे कि लिनक्स पर लगभग सभी कार्यक्रम सुपरसुर द्वारा स्थापित किए जाने हैं क्योंकि उन्हें अपनी कॉन्फ़िगरेशन फ़ाइलों को स्थापित करने के लिए विभिन्न अनुमतियों की आवश्यकता होती है, आदि –

+0

तो, ठीक है। आपके उत्तर के लिए धन्यवाद! वैसे ही करेंगे। – user1485818

0

एचएएल इसे बंद कर दिया गया है, मुझे लगता है कि कलम यूएसबी के साथ काम करने के लिए यूडीस्क का बेहतर उपयोग करें। फिर, आप विधियों FilesystemMount और FilesystemUnmount विधियों का उपयोग कर सकते हैं, मैं यहां एक उदाहरण बना सकता हूं (https://gist.github.com/3037221) और यहां आधिकारिक दस्तावेज है (http://hal.freedesktop.org/docs/udisks/Device। एचटीएमएल # Device.FilesystemMount)।