【发布时间】:2018-11-08 16:10:18
【问题描述】:
我们的部署环境中有一个 virtualenv,其中 .pyc 文件是符号链接 - 特别是 <venv_root>/lib/python2.7/ 中的那些。在什么情况下会发生这种情况?
我们的环境:
- CentOS 7
- Python 2.7.5
- virtualenv 16.0.0
- 一些(但不是全部)python 进程在其他服务器上运行,virtualenv 可通过 NFS 获得(具有写入权限)
- virtualenv 创建在与根文件系统不同的文件系统上
我习惯于看到<venv_root>/lib/python2.7/ 中的.py 文件有时是符号链接。我知道我可以使用--always-copy 标志来阻止.py 文件成为符号链接。但我习惯了 .pyc 文件总是纯文件。
我尝试过的实验(在相关服务器上):
- 在根文件系统上创建新的 virtualenv
- pyc 文件创建为文件
- 在 NFS 主机和 NFS 客户端上使用 virtualenv 运行脚本
- pyc 文件没有变化
- 触摸
lib/python2.7/os.py并重新运行脚本- pyc 文件没有变化
- 删除
lib/python2.7/os.pyc并重新运行脚本- 在NFS主机上运行,pyc文件被创建为普通文件
- 在NFS客户端上运行,pyc文件被创建为普通文件
重复关键问题 - 在什么情况下,.pyc 文件会成为符号链接?
以下是相关 virtualenv 目录的完整列表:
[root@appname-master]# ls -l /export/appname/common/venv/5_4_1/lib/python2.7/
total 68
lrwxrwxrwx 1 appname appname 31 Nov 8 04:17 _abcoll.py -> /usr/lib64/python2.7/_abcoll.py
lrwxrwxrwx 1 appname appname 62 Nov 8 04:17 _abcoll.pyc -> /usr/local/company/appname/venv/lib/python2.7/_abcoll.pyc
lrwxrwxrwx 1 appname appname 27 Nov 8 04:17 abc.py -> /usr/lib64/python2.7/abc.py
lrwxrwxrwx 1 appname appname 58 Nov 8 04:17 abc.pyc -> /usr/local/company/appname/venv/lib/python2.7/abc.pyc
lrwxrwxrwx 1 appname appname 30 Nov 8 04:17 codecs.py -> /usr/lib64/python2.7/codecs.py
lrwxrwxrwx 1 appname appname 61 Nov 8 04:17 codecs.pyc -> /usr/local/company/appname/venv/lib/python2.7/codecs.pyc
lrwxrwxrwx 1 appname appname 27 Nov 8 04:17 config -> /usr/lib64/python2.7/config
lrwxrwxrwx 1 appname appname 32 Nov 8 04:17 copy_reg.py -> /usr/lib64/python2.7/copy_reg.py
lrwxrwxrwx 1 appname appname 63 Nov 8 04:17 copy_reg.pyc -> /usr/local/company/appname/venv/lib/python2.7/copy_reg.pyc
lrwxrwxrwx 1 appname appname 60 Nov 8 04:17 distutils -> /usr/local/company/appname/venv/lib/python2.7/distutils
lrwxrwxrwx 1 appname appname 30 Nov 8 04:17 encodings -> /usr/lib64/python2.7/encodings
lrwxrwxrwx 1 appname appname 31 Nov 8 04:17 fnmatch.py -> /usr/lib64/python2.7/fnmatch.py
lrwxrwxrwx 1 appname appname 62 Nov 8 04:17 fnmatch.pyc -> /usr/local/company/appname/venv/lib/python2.7/fnmatch.pyc
lrwxrwxrwx 1 appname appname 35 Nov 8 04:17 genericpath.py -> /usr/lib64/python2.7/genericpath.py
lrwxrwxrwx 1 appname appname 66 Nov 8 04:17 genericpath.pyc -> /usr/local/company/appname/venv/lib/python2.7/genericpath.pyc
lrwxrwxrwx 1 appname appname 32 Nov 8 04:17 lib-dynload -> /usr/lib64/python2.7/lib-dynload
lrwxrwxrwx 1 appname appname 33 Nov 8 04:17 linecache.py -> /usr/lib64/python2.7/linecache.py
lrwxrwxrwx 1 appname appname 64 Nov 8 04:17 linecache.pyc -> /usr/local/company/appname/venv/lib/python2.7/linecache.pyc
lrwxrwxrwx 1 appname appname 30 Nov 8 04:17 locale.py -> /usr/lib64/python2.7/locale.py
lrwxrwxrwx 1 appname appname 61 Nov 8 04:17 locale.pyc -> /usr/local/company/appname/venv/lib/python2.7/locale.pyc
-rw-rw-r--+ 1 appname appname 0 Nov 8 04:17 no-global-site-packages.txt
lrwxrwxrwx 1 appname appname 30 Nov 8 04:17 ntpath.py -> /usr/lib64/python2.7/ntpath.py
-rw-rw-r--+ 1 appname appname 4 Nov 8 04:17 orig-prefix.txt
lrwxrwxrwx 1 appname appname 26 Nov 8 04:17 os.py -> /usr/lib64/python2.7/os.py
lrwxrwxrwx 1 appname appname 57 Nov 8 04:17 os.pyc -> /usr/local/company/appname/venv/lib/python2.7/os.pyc
lrwxrwxrwx 1 appname appname 33 Nov 8 04:17 posixpath.py -> /usr/lib64/python2.7/posixpath.py
lrwxrwxrwx 1 appname appname 64 Nov 8 04:17 posixpath.pyc -> /usr/local/company/appname/venv/lib/python2.7/posixpath.pyc
lrwxrwxrwx 1 appname appname 26 Nov 8 04:17 re.py -> /usr/lib64/python2.7/re.py
lrwxrwxrwx 1 appname appname 57 Nov 8 04:17 re.pyc -> /usr/local/company/appname/venv/lib/python2.7/re.pyc
drwxrwxr-x+ 40 appname appname 4096 Nov 8 04:17 site-packages
-rw-rw-r--+ 1 appname appname 29021 Nov 8 04:17 site.py
-rw-rw-r--+ 1 appname appname 26716 Nov 8 04:17 site.pyc
lrwxrwxrwx 1 appname appname 35 Nov 8 04:17 sre_compile.py -> /usr/lib64/python2.7/sre_compile.py
lrwxrwxrwx 1 appname appname 66 Nov 8 04:17 sre_compile.pyc -> /usr/local/company/appname/venv/lib/python2.7/sre_compile.pyc
lrwxrwxrwx 1 appname appname 37 Nov 8 04:17 sre_constants.py -> /usr/lib64/python2.7/sre_constants.py
lrwxrwxrwx 1 appname appname 68 Nov 8 04:17 sre_constants.pyc -> /usr/local/company/appname/venv/lib/python2.7/sre_constants.pyc
lrwxrwxrwx 1 appname appname 33 Nov 8 04:17 sre_parse.py -> /usr/lib64/python2.7/sre_parse.py
lrwxrwxrwx 1 appname appname 64 Nov 8 04:17 sre_parse.pyc -> /usr/local/company/appname/venv/lib/python2.7/sre_parse.pyc
lrwxrwxrwx 1 appname appname 27 Nov 8 04:17 sre.py -> /usr/lib64/python2.7/sre.py
lrwxrwxrwx 1 appname appname 28 Nov 8 04:17 stat.py -> /usr/lib64/python2.7/stat.py
lrwxrwxrwx 1 appname appname 59 Nov 8 04:17 stat.pyc -> /usr/local/company/appname/venv/lib/python2.7/stat.pyc
lrwxrwxrwx 1 appname appname 29 Nov 8 04:17 types.py -> /usr/lib64/python2.7/types.py
lrwxrwxrwx 1 appname appname 60 Nov 8 04:17 types.pyc -> /usr/local/company/appname/venv/lib/python2.7/types.pyc
lrwxrwxrwx 1 appname appname 32 Nov 8 04:17 UserDict.py -> /usr/lib64/python2.7/UserDict.py
lrwxrwxrwx 1 appname appname 63 Nov 8 04:17 UserDict.pyc -> /usr/local/company/appname/venv/lib/python2.7/UserDict.pyc
lrwxrwxrwx 1 appname appname 32 Nov 8 04:17 warnings.py -> /usr/lib64/python2.7/warnings.py
lrwxrwxrwx 1 appname appname 63 Nov 8 04:17 warnings.pyc -> /usr/local/company/appname/venv/lib/python2.7/warnings.pyc
lrwxrwxrwx 1 appname appname 35 Nov 8 04:17 _weakrefset.py -> /usr/lib64/python2.7/_weakrefset.py
lrwxrwxrwx 1 appname appname 66 Nov 8 04:17 _weakrefset.pyc -> /usr/local/company/appname/venv/lib/python2.7/_weakrefset.pyc
(我也对为什么.pyc 链接指向系统文件时.py 链接指向另一个virtualenv 感兴趣。但我认为了解.pyc 文件如何成为符号链接会是一个好的开始。)
【问题讨论】:
标签: python virtualenv symlink pyc