【问题标题】:How to know when you are in a symbolic link如何知道您何时处于符号链接中
【发布时间】:2009-01-14 09:52:41
【问题描述】:

在 Python 中,如何知道你所在的目录在符号链接中?

我有一个目录/tmp/foo/kiwi

我创建了一个符号链接 /tmp/bar 指向 /tmp/foo

我进入/tmp/bar/kiwi

linux 命令 pwd 告诉我我在 /tmp/bar/kiwi,这是正确的。

python 命令提示符告诉我我在 /tmp/foo/kiwi:

Python 2.5.1 (r251:54863, Oct  5 2007, 13:36:32) 
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/tmp/foo/kiwi'

有没有办法在 Python 中获取我真正所在的目录?

【问题讨论】:

  • 呃,你真的在​​ /tmp/foo/kiwi,而不是“bar”。 /bin/pwd(和 os.getcwd())将报告“物理”位置,而不是“逻辑”位置。

标签: python


【解决方案1】:

如果你没有找到其他东西,你可以使用

os.getenv("PWD")

它不是真正的可移植 python 方法,但适用于 POSIX 系统。它获取PWD 环境变量的值,该变量由cd 命令(如果您不使用cd -P)设置为您在运行python 脚本之前导航到的路径名(请参阅man cd) .当然,该变量不会被 python 更改。因此,如果您在其他地方os.chdir,该变量将保留其值。

无论如何,作为一个侧节点,/tmp/foo/kiwi 是你所在的目录。我不确定除了 shell 是否有任何东西知道你真的通过另一条路径导航到那个地点,实际上:)

【讨论】:

  • 如果你做一个 os.chdir() -- 或者任何等效的 Python 有,$PWD,从那里继承的环境不会改变......
  • 是的,这仅适用于他的环境中有 PWD 并希望获得其初始值的情况:)
  • 所以我会认为它不是真正可行的便携方式。谢谢。
【解决方案2】:

如果您的符号链接是按照您所说的方式设置的,那么/tmp/foo/kiwi 就是您真正所在的目录。/tmp/bar/kiwi 只是到达同一位置的另一种方式。

请注意,shell 命令pwd -P 将为您提供当前目录的物理路径。在您的情况下,shell 会记住您通过 bar 符号链接知道您所在的位置,因此它会告诉您您在 /tmp/bar/kiwi 中。

【讨论】:

    【解决方案3】:

    作为一个有趣的问题,如果你在一个目录中,你可以使用 -P 选项来获取 pwd 命令来解析到它们实际目录的所有符号链接。

    $ ln -s Desktop toto
    $ cd toto
    $
    $ pwd
    /home/ken/toto
    $ 
    $ pwd -P
    /home/ken/Desktop
    $ 
    

    HTH

    干杯,

    罗伯

    【讨论】:

    • 请注意,pwd 是大多数 shell 中的内置函数,通常用作“pwd”,而不是“pwd -P”。 PS:嗨,罗伯
    【解决方案4】:

    你也可以试试 lstat。它将为您提供有关文件/目录的信息,包括告诉您它是否是一个链接,并向您显示它链接到的位置。

    【讨论】:

    • os.lstat('.') 在符号链接目录中似乎与 os.stat('.') 匹配,所以这里的提问者可能没有用。
    【解决方案5】:

    当您的 shell 返回路径时,它依赖于在您遍历符号链接路径时设置的 shell 环境变量“PWD”,但实际上它位于 getcwd() 返回的目录下。所以,如果你从 shell 的 PWD 得到你想要的。

    >>> os.getcwd() '/home/ors/foo/tmp/foo/kiwi' >>> os.environ["密码"] '/home/ors/foo/tmp/bar/kiwi' >>>

    【讨论】:

      【解决方案6】:

      这是另一种方式:

      import os
      os.popen('pwd').read().strip('\n')
      

      下面是python shell中的演示:

      >>> import os
      >>> os.popen('pwd').read().strip('\n')
      '/home/projteam/staging/site/proj'
      >>> # This returns actual path
      >>> import subprocess
      >>> p = subprocess.Popen('pwd', stdout=subprocess.PIPE)
      >>> p.communicate()[0]  # returns non-symlink path
      '/home/projteam/staging/deploys/20150114-141114/site/proj\n'
      

      获取环境变量 PWD 并不总是对我有用,所以我使用 popen 方法。干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-21
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        相关资源
        最近更新 更多