views:

191

answers:

1

I have a similar question like the one asked here but I need it to work on OSX.

http://stackoverflow.com/questions/2625877/copy-files-to-nework-path-or-drive-using-python

So i want to save a file on a SMB network share. Can this be done?

Thanks!

+1  A: 

Yes, it can be done. First, mount your SMB network share to the local filesystem by calling a command like this from Python:

mount -t smbfs //user@server/sharename share

(You can do it using the subprocess module). share is the name of the directory where the SMB network share will be mounted to, and I guess it has to be writable by the user. After that, you can copy the file using shutil.copyfile. Finally, you have to un-mount the SMB network share:

umount share

Probably it's the best to create a context manager in Python that takes care of mounting and unmounting:

from contextlib import contextmanager
import os
import shutil
import subprocess

@contextmanager
def mounted(remote_dir, local_dir):
    local_dir = os.path.abspath(local_dir)
    retcode = subprocess.call(["/sbin/mount", "-t", "smbfs", remote_dir, local_dir])
    if retcode != 0:
        raise OSError("mount operation failed")
    try:
        yield
    finally:
        retcode = subprocess.call(["/sbin/umount", local_dir])
        if retcode != 0:
            raise OSError("umount operation failed")

with mounted(remote_dir, local_dir):
    shutil.copy(file_to_be_copied, local_dir)

The above code snippet is not tested, but it should work in general (apart from syntax errors that I did not notice). Also note that mounted is very similar to the network_share_auth context manager I posted in my other answer, so you might as well combine the two by checking what platform you are on using the platform module and then calling the appropriate commands.

Tamás
Cool! Got it working! Thanks for the quick (and elaborate) reply!(Would like to vote up, but haven't got enough rep :-| )
Gumbah