[英]Executing python script built under different virtual environment/venv?
[英]Python script inside venv and REPL pulling in different environment variables
我在 Python 3 venv 內的bin/activate
中添加了以下行。
export RAIN_ENV="dev"
我激活了 venv,然后啟動了 REPL,可以看到RAIN_ENV
...
source /var/www/rain/bin/activate
(rain) crmpicco/var/www/rain(master|✚1) % python
Python 3.9.10 (main, Jan 15 2022, 11:48:04)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.environ)
environ({'__CFBundleIdentifier': 'com.apple.Terminal', 'TERM_PROGRAM_VERSION': '445', 'TERM_SESSION_ID': '12033E65-4D4B-4C11-8471-2708CFC4F550', 'SHELL': '/bin/zsh', 'PATH': '/var/www/rain/bin:/usr/local/opt/php@7.4/sbin:/usr/local/opt/php@7.4/bin:/Users/crm/.yarn/bin:/Users/crm/.config/yarn/global/node_modules/.bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/opt/postgresql@12/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'SHLVL': '1', 'PWD': '/var/www/rain', 'OLDPWD': '/var/www/rain/rain', 'LIBRESSL_REDIRECT_STUB_ABORT': '0', 'EDITOR': '/usr/bin/vim', '__GIT_PROMPT_DIR': '/Users/crm/zsh-git-prompt', 'GIT_PROMPT_EXECUTABLE': 'python', 'PS1': '(rain) %B%m%~%b$(git_super_status) %# ', 'RAIN_ENV': 'dev', 'VIRTUAL_ENV': '/var/www/rain', 'LANG': 'en_AU.UTF-8', '_': '/var/www/rain/bin/python'})
>>>
但是,當我在 venv 中啟動 Python 3 應用程序時,代碼會返回一組完全不同的環境變量:
(rain) crmpicco/var/www/rain(master|✚1) % sudo python main.py
Password:
env vars
environ({'TERM': 'xterm-256color', 'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.rny3w7r22E/Listeners', 'HOME': '/Users/crm', 'PATH': '/var/www/rain/bin:/usr/local/opt/php@7.4/sbin:/usr/local/opt/php@7.4/bin:/Users/crm/.yarn/bin:/Users/crm/.config/yarn/global/node_modules/.bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/opt/postgresql@12/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'EDITOR': '/usr/bin/vim', 'PS1': '(rain) %B%m%~%b$(git_super_status) %# ', 'LANG': 'en_AU.UTF-8', 'MAIL': '/var/mail/root', 'LOGNAME': 'root', 'USER': 'root', 'SHELL': '/bin/sh', 'SUDO_COMMAND': '/var/www/rain/bin/python main.py --env=dev', 'SUDO_USER': 'crm', 'SUDO_UID': '502', 'SUDO_GID': '20', '__CF_USER_TEXT_ENCODING': '0x0:0:15'})
output 有print(os.environ)
的結果
如何從 venv 中提取變量?
(rain) crmpicco/var/www/rain(master|✚2) % which python
/var/www/rain/bin/python
當您使用sudo
時,它會在不同環境中以不同用戶身份運行命令 - 沒有venv
,使用標准 python。
您可能需要運行which python
以在活動venv
中獲取/full/path/to/python
並稍后使用
sudo /full/path/to/python main.py
它可能還需要使用選項--preserve-env
( -E
) 運行sudo
才能訪問RAIN_ENV="dev"
和原始環境中的所有其他設置
sudo -E /full/path/to/python main.py
或更短(在bash
中,可能在zsh
和最新的fish
中)
sudo -E $(which python) main.py
您可以使用sudo -E env
測試環境
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.