У нас есть virtualenv в нашей среде развертывания, где файлы .pyc
являются символьными ссылками, особенно в <venv_root>/lib/python2.7/
. При каких условиях это происходит?
Наше окружение:
- CentOS 7
- Python 2.7.5
- virtualenv 16.0.0
- некоторые (но не все) процессы Python, запущенные на других серверах с virtualenv, доступным через NFS (с разрешениями на запись)
- virtualenv, созданный в другой файловой системе, чем корневая файловая система
Я привык видеть .py
файлы в <venv_root>/lib/python2.7/
, иногда являющиеся символическими ссылками. Я знаю, что могу использовать флаг --always-copy
, чтобы файлы .py
не были символическими ссылками. Но я привык к .pyc
файлам, которые всегда были простыми файлами.
Эксперименты, которые я пробовал (на рассматриваемом сервере):
- создать новый virtualenv в корневой файловой системе
- pyc файлы, созданные как файлы
- запускать скрипты, используя virtualenv на хосте NFS и клиенте NFS
- без изменений в pyc-файлах
- коснитесь
lib/python2.7/os.py
и перезапустите сценарии
- без изменений в pyc-файлах
- удалить
lib/python2.7/os.pyc
и перезапустить скрипты
- работает на хосте NFS, файл pyc создается как обычный файл
- работает на клиенте NFS, файл pyc создается как обычный файл
Повторим ключевой вопрос - при каких условиях я получу .pyc
файлы, являющиеся ссылками sym?
Вот полный список рассматриваемого каталога 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
sym указывают на другой virtualenv, когда ссылки .py
указывают на системные файлы. Но я подумал, что понимание того, как файлы .pyc
могут стать ссылками sym, быть хорошим началом.)