环境:
Mac 操作系统 Catalina 10.15.7
Python 3.7.13
问题:
我的Python代码需要执行一些终端命令。但我收到错误消息:“找不到命令”。
所以我从“终端”测试了这些相同的命令,它运行得很好。
因此,我比较了终端加载的环境变量和 python 脚本加载的环境变量。结果是它们不一样。
您可以在这里看到我的 .zshrc 文件的内容:
export PATH="/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home:/Users/alisa/Android/cmdline-tools/latest/bin:/Users/alisa/Android/platform-tools:/bin:/opt/local/bin:/sbin:/usr/local/bin:/usr/sbin/:/usr/bin:/usr/local/opt/qt@/bin/:/usr/local/opt/qt@6/bin/:/Users/alisa/.wdm/drivers/geckodriver/macos/v0.30.0:/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home:/usr/local/Cellar/[email protected]/:/usr/local/Cellar/[email protected]/3.9.12_1/bin/:/usr/local/lib/python3.9/site-packages:/usr/local/Cellar/[email protected]/3.9.12_1/Frameworks/Python.framework/Versions/3.9/bin/"
export ANDROID_HOME="/Users/alisa/Android"
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home"
DYLD_LIBRARY_PATH="/usr/local/lib/python3.9/site-packages/PySide2:/usr/local/lib/python3.9/site-packages/PyQt5/:/Library/Java/JavaVirtualMachines/jdk-15.0.2.jdk/Contents/Home"
export DYLD_LIBRARY_PATH
export DYLD_PRINT_LIBRARIES=1
set QT_DEBUG_PLUGINS=1
export REQUESTS_CA_BUNDLE="$HOME/.mac-ca-roots"
export LDFLAGS="-L$(brew --prefix xz)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib"
export CPPFLAGS="-I$(brew --prefix xz)/include -I$(brew --prefix readline)/include -I$(brew --prefix zlib)/include -I$(xcrun --show-sdk-path)/usr/include"
alias python3=/usr/local/opt/[email protected]/bin/python3
APPDATA="/users/alisa"
export APPDATA
TESSDATA_PREFIX="/opt/local/share/tessdata"
export TESSDATA_PREFIX
export PATH="/usr/local/sbin:$PATH"
alias python3="/usr/local/Cellar/[email protected]/3.9.12_1/Frameworks/Python.framework/Versions/3.9/bin/python3.9"
export PYTHONPATH=/usr/local/lib/python3.9/site-packages/
这里是用我的 python 代码加载的环境变量的值:
HOME:/Users/alisa
LC_CTYPE:en_GB.UTF-8
LD_LIBRARY_PATH:/usr/local/Cellar/opencv/4.5.5_2/lib/python3.9/site-packages/cv2/../../../../lib:
LOGNAME:alisa
PATH:/usr/bin:/bin:/usr/sbin:/sbin
PWD:/Volumes/GoogleDrive/My Drive/Phonebot/Phonebot_debug3
PYCHARM_HOSTED:1
PYTHONIOENCODING:UTF-8
PYTHONPATH:/Volumes/GoogleDrive/My Drive/Phonebot/Phonebot_debug3
PYTHONUNBUFFERED:1
SHELL:/bin/zsh
SSH_AUTH_SOCK:/private/tmp/com.apple.launchd.OJCYKYn5oR/Listeners
TMPDIR:/var/folders/gg/d60v4x454xd_n7dzwkv_y9140000gn/T/
USER:alisa
XPC_FLAGS:0x0
XPC_SERVICE_NAME:com.jetbrains.pycharm.20596
__CF_USER_TEXT_ENCODING:0x1F5:0x0:0x2
您可以看到 PATH 不一样,这就是为什么我收到错误“找不到命令”。
这是我用来显示环境变量的Python代码:
def GetEnvVariables():
dico_env={}
for k, v in sorted(os.environ.items()):
#print(k+':', v)
dico_env[k]=v
print(f"dico_env:{dico_env}")
return dico_env
dico=mymodules.GetEnvVariables()
for key, value in dico.items():
print('%s:%s\n' % (key, value))
我也尝试过这个命令:
print(os.environ.get('PATH'))
这是输出:
/usr/bin:/bin:/usr/sbin:/sbin
同样,PATH 值与我的 .zshrc 文件不同
我正在使用 pycharm 来执行我的 Python 代码。所以我从终端运行我的代码,这次它成功了! 我停止并重新启动 Pycharm,但仍然遇到同样的问题。
有谁知道如何修改 Pycharm 以考虑我所有的环境变量?
谢谢
请使用
.zshenv
并确保重新启动 PyCharm。适用于 PyCharm 2022.2.3 Professional。
在这里发布这个解决方案和解释,因为我刚刚花了一整天的时间解决这个问题。
为什么 PyCharm 与 zsh 中的环境变量可能不同
当您的终端应用程序启动时,它会读取并处理许多 zsh 配置,并在此过程中获取环境变量(
PATH
,尤其是其中)。
当您从 Finder 或 Launchpad、Dock 或其他地方启动应用程序时,它会使用
launchd
(pid 1) 启动它。启动的进程实际上继承了调用它的进程的环境。这些进程不是 zsh,并且没有在常用 shell 中设置所有环境变量。
如果您运行
open /Applications/PyCharm.app
(或您的 PyCharm 应用程序所在的任何位置),您将通过 launchd 启动该应用程序,但您将在完整的 zsh 环境中从进程中完成此操作。魔法!您的环境变量出现。
使其永久化
当我从终端启动 PyCharm 时(使用
open
),后续从 Dock 或 Spotlight 启动实际上使用我在 zsh 中获得的相同环境变量打开它。显然,这是由于跨会话缓存所致。
为了使更改永久生效,您可以使用
launchctl setenv <variable> <value>
命令。在终端中以普通用户身份运行它将会配置 launchd。
如果您想更改为所有用户配置的 PATH 变量,只需将包含路径的文件(每行一个)添加到
/etc/paths.d
。例如:sudo echo "/opt/homebrew/bin\n/opt/homebrew/sbin" > /etc/paths.d/homebrew
。我相信您需要重新启动才能生效。
希望这可以帮助人们比我花更少的时间来解决这个问题。