繁体   English   中英

为什么 Python 遵循符号链接? 我该如何解决这个问题?

[英]Why does Python follow symlinks? How do I work around that?

这是我的目录布局:

projects/
   +-projectA/
     |---moduleA.py
     |---script.py -> ../projectB/script.py
   +-projectB/
     |---script.py

这是 script.py 包含的内容:

import moduleA
print "hello there"

这是我在做什么:

$ pwd
[...]/projects/projectA

$ python2 script.py
Traceback (most recent call last):
  File "script.py", line 1, in <module>
    import moduleA
ImportError: No module named moduleA

这种布局的原因是项目 A 和项目 B 都来自git存储库,并且每隔一段时间更新一次。 但是,我编写了 projectB 并希望对其进行编辑和推送,而不必复制文件(它依赖于项目 A 中的内容)。

将它作为项目 A 的子模块/一部分不是一个选项,因为脚本具有项目 A 的维护者不想要的依赖项。

反过来也不是一个选项,因为它也太小了,以至于不能保证将项目 A(很大,实际上有很多不同的模块)添加为项目 B 中的子模块,这也会创建不必要的额外文件。 此外,用户主要位于项目 A 的目录中,因此子模块无论如何都没有意义。

出于显而易见的原因,我也不想使用硬链接 我也不能做类似的事情

sys.path.append("../projectA")

在 script.py 中,因为 script.py 的其他用户可能没有与我相同的目录布局,有些人会直接将其下载到 projectA(无需克隆)。

那么首先,为什么 python 解释器遵循该符号链接,而不是像在项目 A 的目录中那样执行代码?

其次,我怎样才能通过上述警告解决这个问题?

(也可以随意回答上述两个问题中的一个。)

我今天刚刚在 python3.9 上遇到了同样的“惊喜”——所以至少 python 生态系统似乎是稳定和向上兼容的。 ;)

另一个惊喜是,使用PYTHONPATH=. “修复”这种行为! 我猜只有PYTHONPATH=$PWD可以完成这项工作,不知道为什么PYTHONPATH=. 也很好。 ;)

$ python3.9 symlink.py  #  this breaks with "import local_module" -- ModuleNotFoundError: No module named 'local_module'
$ PYTHONPATH=.    python3.9 symlink.py # works
$ PYTHONPATH=$PWD python3.9 symlink.py # works

我仍然不喜欢那个“解决方案”(还没有?),所以现在 work/test 目录现在不再使用任何符号链接——所有的东西现在都被复制/rsync 到 test 目录中。 :-(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM