美文网首页程序员Pythoner集中营
[Python]os.symlink创建软链接二三事

[Python]os.symlink创建软链接二三事

作者: 四明羽客 | 来源:发表于2018-01-09 13:24 被阅读1240次

昨天用到了os.symlink函数,在使用过程中踩了几个坑,记录下
注:下文所有的代码都是针对 Linux 等 POSIX 系统,Windows系统没有测试过

首先来看下os.symlink函数的介绍

Help on built-in function symlink in module posix:

symlink(...)
    symlink(src, dst)
    
    Create a symbolic link pointing to src named dst. 

看介绍里完全没有说 src和dst能不能用 relative path,也没规定说必须用absolute path
只能自己摸索了

  1. src和dst都是absolute path;完美,非常顺利的建立了链接
  2. src是relative path,dst 是 absolute path;此处遇到了坑,后面详细说明
  3. src是absolute path, dst是relative path;此处也有坑,后叙
  4. src和dst都是relative path,也有坑

总之,凡是用到relative path的都需要注意

举例说明:

src:/tmp/make/CleanSpec.mk
dst: /tmp/code/build/CleanSpec.mk
当前目录:/tmp

情景1 src和dst都是absolute path
这种就不说了吧,铁定成功

情景2,src用relative path,dst用absolute path

os.symlink('make/CleanSpec.mk', '/tmp/code/build/CleanSpec.mk')

链接创建了,但没有指向src,是个空的文件;原因是 dst是从它所在的目录去选择src的,而src配置的是'make/CleanSpec.mk',那么dst查找的src就是 '/tmp/code/build/make/CleanSpec.mk',根本没有这个文件,当然找不到

所以src必须是相对于dst的relative path,也就是 '../../make/CleanSpce.mk'

os.path.relpath('/tmp/make/CleanSpec.mk', start='/tmp/code/build/') # 可以用relpath方法获取relative path,注意start是个目录
os.symlink('../../make/CleanSpce.mk', '/tmp/code/build/CleanSpec.mk')

情景3,src用absolute path,dst用relative path

# 在当前目录下(/tmp)
os.symlink('/tmp/make/CleanSpec.mk', 'code/build/CleanSpec.mk')

可以正确地创建链接。但是当我们把当前目录(/tmp)切换到/tmp/make,上面的命令就无法正确的创建链接了。因为dst是从当前目录开始去寻找路径的,上面的dst relative path,在把当前目录切换到/tmp/make之后,表示的路径是/tmp/make/code/build/CleanSpec.mk,而/tmp/make/code/build目录是不存在的,所以无法创建成功,要改成'../code/build/CleanSpec.mk'
所以dst必须是相对于当前目录的relative path。也可以用os.path.relpath函数获得,只是start=当前路径

情景4,src和dst都是relative path
只要理解了情景2和情景3的结论,那情景4对你来说就so easy~
只要记住src是相对于dst的relative path,dst是相对于当前路径的relative path,就能正确的创建链接。

# 当前路径(/tmp)
os.symlink('../../make/CleanSpec.mk',  'code/build/CleanSpec.mk')

# 当前路径(/tmp/make)
os.symlink('../../make/CleanSpec.mk', '../code/build/CleanSpec.mk')

总结

os.symlink 可以简单的理解为 等同于 Linux系统的 ln -s命令
它的两个参数可以是relative path,也可以是absolute path
只是要记住:

  1. source 的 relative path是相对于 destination的
  2. destination的relative path是相对于 当前路径的

只要把握这两点,创建链接就不会踩坑

记于 2018-01-09

相关文章

  • [Python]os.symlink创建软链接二三事

    昨天用到了os.symlink函数,在使用过程中踩了几个坑,记录下注:下文所有的代码都是针对 Linux 等 PO...

  • CentOS7-Python3安装

    1.创建安装目录 2.下载python3.6源文件 3.解压安装包 4.编译安装 5.创建软链接 软链接创建后可以...

  • AttributeError: 'module' object

    os.symlink 是创建软连接这个是在Linux上使用的windows 上就不会报错找另外的方法取代

  • 创建软链接

    具体用法是:ln -s 源文件 目标文件。例如:cd /m8/zeppelin/zeppelin-0.6.2-bi...

  • Linux链接命令

    创建软链接以及软硬链接之间的对比: 创建软链接需要写绝对路径: 由于给sb文件创建软链接的时候没有写绝对路径,会有...

  • 创建软链接 ,硬链接

    ln -s 文件 软连接文件 软链接就是源文件的绝对路径大小只是路径几个字符大小 可以跨分区创建...

  • linux基本操作学习2

    文件处理 -软链接 软链接 = windows下的快捷方式 特点:可以对不存在文件创建软链接可以对文件或者目录创建...

  • DAY 13课堂笔记

    链接的概念:分为硬链接 软链接两种创建硬链接 ln 原始文件 目标文件创建软链接 ln -s 原始文件 目标文件 ...

  • [Python] Win10符号链接权限问题

      电脑中毒重装系统后,之前写的打包工具开始出现各种问题,其中之一是(os.symlink)创建符号链接失败,报错...

  • linux创建软链接

    Ubuntu创建软连接 建立软连接 删除软连接 创建软连接

网友评论

    本文标题:[Python]os.symlink创建软链接二三事

    本文链接:https://www.haomeiwen.com/subject/twpwnxtx.html