Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   [Errno 18] Invalid cross-device link using os.rename (http://www.velocityreviews.com/forums/t341597-errno-18-invalid-cross-device-link-using-os-rename.html)

Scott Whitney 02-14-2005 08:48 PM

[Errno 18] Invalid cross-device link using os.rename
 
oldName=/backup/backups/data/WWW_httpd.conf_backups/20050204.httpd.conf

newName=/backup_old/data/WWW_httpd.conf_backups/20050204.httpd.conf

os.rename(oldName,newName) gives:

OSError: [Errno 18] Invalid cross-device link

mv from the shell works fine.

This is Python 2.2.3 from RedHat 9.0.

Any suggestions (other than os.system('mv %s %s')?)


Fredrik Lundh 02-14-2005 08:58 PM

Re: [Errno 18] Invalid cross-device link using os.rename
 
Scott Whitney wrote:

> os.rename(oldName,newName) gives:
>
> OSError: [Errno 18] Invalid cross-device link
>
> mv from the shell works fine.
>
> This is Python 2.2.3 from RedHat 9.0.
>
> Any suggestions (other than os.system('mv %s %s')?)


catch exception and copy if error == errno.EXDEV.

(this is what "mv" does, of course)

or use shutil.move:

>>> import shutil
>>> help(shutil.move)

Help on function move in module shutil:

move(src, dst)
Recursively move a file or directory to another location.

If the destination is on our current filesystem, then simply use
rename. Otherwise, copy src to the dst and then remove src.
A lot more could be done here... A look at a mv.c shows a lot of
the issues this implementation glosses over.

</F>




Jeff Epler 02-15-2005 12:31 AM

Re: [Errno 18] Invalid cross-device link using os.rename
 
mv is a surprisingly complex program, while os.rename is a wrapper
around rename(2) which is probably documented on your system to return
EXDEV under these circumstanes.

os.xxx is generally a fairly thin wrapper around what your OS provides,
and inherits all the "gotchas". For some activities, os.shutil provides
something that is between os.xxx and os.system("xxx") in complexity and
capability.

Jeff

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.6 (GNU/Linux)

iD8DBQFCEULWJd01MZaTXX0RAuavAKCX1bQui+R5m4q4kIZfxU q3rFoqMgCgpOQq
Z+qkuXf4jsxiPGmJPMm3EOw=
=uBq3
-----END PGP SIGNATURE-----


JustScott 02-16-2005 05:53 PM

Re: [Errno 18] Invalid cross-device link using os.rename
 
Thanks, Jeff. I appreciate the input. I just stuck with os.system('mv
%s %s'). Seems to work fine.


On Mon, 14 Feb 2005 18:31:18 -0600, Jeff Epler <jepler@unpythonic.net> wrote:
> mv is a surprisingly complex program, while os.rename is a wrapper
> around rename(2) which is probably documented on your system to return
> EXDEV under these circumstanes.
>
> os.xxx is generally a fairly thin wrapper around what your OS provides,
> and inherits all the "gotchas". For some activities, os.shutil provides
> something that is between os.xxx and os.system("xxx") in complexity and
> capability.
>
> Jeff
>
>
>



All times are GMT. The time now is 05:01 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.