【问题标题】:How to create a relative symlink without changing directory?如何在不更改目录的情况下创建相对符号链接?
【发布时间】:2021-03-18 21:33:01
【问题描述】:

我有目录factory,在该目录下我有应用程序目录app_1_2_3_4。我想在/home/user/目录下为app -> app_1_2_3_4factory下创建一个符号链接,而不使用os.chdir(),就像这样。不想要链接中的完整路径。

user@ubuntu % ls -l factory/
total 0
lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> app_1_2_3_4
drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4

我在python中试过这个

import os

app_dir_path = '/home/user/factory' + '/' + 'app'
app_dir_ver_path = '/home/user/factory' + '/../' + 'app' + '_{}_{}_{}_{}'.format(major, minor, bugfix, build)
os.symlink(app_dir_ver_path, app_dir_path)

但是这个创建带有完整路径的符号链接

user@ubuntu % ls -l factory/
total 0
lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> /home/user/factory/app_1_2_3_4
drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4

我在这里缺少什么?

【问题讨论】:

  • 另外,从不使用 '/' 或 '..' 用户,我们使用 os.path.relpath、os.path.join os.sep、os.pardir 等操作系统方法/助手 ...
  • 你忘了major, minor, bugfix, build = 1, 2, 3, 4

标签: python symlink


【解决方案1】:

只需省略目录即可。

$ ls -l factory
total 0
-rw-r--r-- 1 user user 0 mar 18 18:06 app_1_2_3_4

$ python
>>> import os
>>> os.symlink('app_1_2_3_4', 'factory/bar')
>>> quit()

$ ls -l factory/bar
lrwxrwxrwx 1 user user 11 mar 18 18:10 factory/bar -> app_1_2_3_4

顺便说一句,ln -s 的工作方式完全相同:

$ ln -s app_1_2_3_4 factory/foo

$ ls -l factory/foo
lrwxrwxrwx 1 user user 11 mar 18 18:09 factory/foo -> app_1_2_3_4

【讨论】:

    【解决方案2】:

    os.symlink() 接受一个参数dir_fd,它是一个目录描述符,来自文档:

    如果dir_fd不是None,应该是一个文件描述符,指向一个目录,操作的路径应该是相对的;然后路径将相对于该目录。

    您可以在os.open() 的帮助下获取目录描述符,见下文。

    (理想情况下,您还想在加入路径时使用f-stringsos.path.join()。)

    import os
    
    # Assuming you are getting 'app_dir_ver_path' from somewhere else
    # and 'major', 'minor', 'bugfix', 'build' are defined.
    # "/home/user/factory/app_1_2_3_4"
    app_dir_ver_path = os.path.join(
        /home/user/factory,
        f'app_{major}_{minor}_{bugfix}_{build}'
    )
    
    # Get the directory where the symlink is supposed to be created:
    # "/home/user/factory"
    app_dir_ver_name = os.path.dirname(app_dir_ver_path)
    
    # Get the name of the directory to be linked:
    # "app_1_2_3_4"
    app_dir_ver_base = os.path.basename(app_dir_ver_path)
    
    # Get the directory desciptor:
    dir_fd = os.open(app_dir_ver_name, os.O_RDONLY)
    
    # Full path for the symlink:
    # "/home/user/factory/app"
    app_dir_path = os.path.join(app_dir_ver_name, 'app')
    
    os.symlink(src=app_dir_ver_base, dst=app_dir_path, dir_fd=dir_fd)
    

    从系统上的任何地方运行,在/home/user/factory 中创建符号链接:

    ls -l /home/user/factory/
    lrwxrwxrwx@  1 user  user   13 Mar 15 04:27 app -> app_1_2_3_4
    drwxrwxr-x@ 18 user  user  576 Mar 18 17:09 app_1_2_3_4
    

    【讨论】:

    • app_dir_ver_nameapp_dir_name,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-08-06
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多