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!
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!
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.