Py2exe Dokan Mount Error
What steps will reproduce the problem?
1. compile any Filesystem to an Executable
2. Try to Mount
3. Get the output:
-----
What version of the product are you using? On what operating system?
pyfilesystem 0.4.0 XP32 Python 2.6
Please provide any additional information below.
-----
Source Code (memfs.py):
from fs.memoryfs import MemoryFS
from fs.expose import dokan
import time
fs = MemoryFS()
mp = dokan.mount(fs ,'u' ,fsname='memfs', volname='memfs')
time.sleep(10000)
-----
Py2exe Setup Scrypt:
import py2exe, sys, os
sys.argv.append('py2exe')
setup(options = {'py2exe': {
'bundle_files': 1,
'unbuffered': True,
'optimize':2
}},
console = [{'script': "memfs.py"}],
zipfile = None,)
Original issue reported on code.google.com by [email protected] on 13 Feb 2012 at 2:10
Error:
Traceback (most recent call last):
File "memfs.py", line 5, in <module>
File "fs\expose\dokan\__init__.pyo", line 936, in mount
File "fs\expose\dokan\__init__.pyo", line 913, in check_ready
OSError: dokan mount process seems to be hung
Original comment by [email protected] on 13 Feb 2012 at 2:15
Testet pyfilesystem 0.4.0 + pyinstaller + Python 2.6, same Error!
Original comment by [email protected] on 6 Mar 2012 at 3:39
Made a Bugreport to py2exe Project:
https://sourceforge.net/tracker/?func=detail&aid=3499396&group_id=15583&atid=115
583
Original comment by [email protected] on 8 Mar 2012 at 9:22
The message comes from: fs/expose/dokan/__init__.py line:896 ::
def check_ready(mp=None):
if ready_callback is not False:
check_alive(mp)
for _ in xrange(100):
try:
os.stat(drive+":\\")
except EnvironmentError, e:
check_alive(mp)
time.sleep(0.05)
else:
check_alive(mp)
if ready_callback:
return ready_callback()
else:
return None
else:
check_alive(mp)
raise OSError("dokan mount process seems to be hung")
Original comment by [email protected] on 11 Mar 2012 at 12:08
I got a solution!!!!
If I use the foreground=True option while mounting, there is no pickeling and
py2exe runs like a charm. I used an own thread for mounting with the thread
module.
The thread is like this:
def _mount_thread_windows(self,*args):
"Thread where the mount process runs"
try:
from fs.expose import dokan
except:
print("""Couldnt import Dokan, please reinstall it from:""")
print("""http://dokan-dev.net/en/download""")
self.mount = dokan.mount(self.fs_obj ,self.mountfolder ,fsname='FlexFS', volname='FlexFS',foreground=True)
Started with:
def windows_mount(self,path=None):
"Start the mount thread"
self.mountfolder = 'x:'
self._print("""Mounting: "%s" """%self.mountfolder)
thread.start_new_thread(self._mount_thread_windows,(None,))
self.mounted = True
self._print("done")
return True
Umounting works like:
def windows_umount(self):
self._print('Unmounting: %s'%self.mountfolder)
from fs.expose import dokan
done = False
counter = 0
while not done:
counter += 1
try:
dokan.unmount(self.mountfolder)
#~ self.__log('Umount: Umount done')
done = True
except:
#~ self.__log('Umount: Umount error %s'%counter)
time.sleep(1)
self.mounted = False
self._print('Done')
Without pickling other restrictions are gone, too.
fe: no logging or the use of xmlrpc library in your Filesystem.
Original comment by [email protected] on 18 Feb 2013 at 6:12
[deleted comment]
[deleted comment]
[deleted comment]
I created a lib that should solve the problem and doesnt need to pickle the
filesystem. Plus it uses automatically fuse or dokan with the same interface. I
hope this is usefull.
"""
fs.expose.mounter
=================
Expose an FS object fuse and dokan with a consistent usage.
This module provides the necessary interfaces to expose an FS object over
dokan or fuse, it checks automaticalli what to use.
to mount your Filesystem, do the following:
>>> from fs.memoryfs import MemoryFS
>>> from fs.expose import mounter
>>> fs = MemoryFS()
>>> mt = mounter.Mounter(fs,"Testdrive")
>>> mt.mount()
>>> mt.path
'/home/"username"/Testdrive'
>>> mt.unmount()
This should mount correct under windows, linux and mac.
"""
Original comment by [email protected] on 20 Feb 2013 at 10:57
Attachments:
Looks interesting. Please post this on the discussion list...
Original comment by willmcgugan on 20 Feb 2013 at 11:01