[英]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.