mac:通过 pyenv 使用 python 3 会引发导入错误

mac: using python 3 via pyenv throws import errors

什么不起作用

一直在尝试使用 pyenv 在 mac 上设置 python 3.8.5,如 Matthew Broberg

所述
$ brew install pyenv && pyenv install 3.8.5

.zshrc

# Python
# https://opensource.com/article/19/5/python-3-default-mac#what-we-should-do
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

# Pip - https://gist.github.com/haircut/14705555d58432a5f01f9188006a04ed
PATH="$PATH:~/Library/Python/2.7/bin"
PATH="$PATH:~/Library/Python/3.8.5/bin"

正在做

$ python --version
Python 3.8.5

但是 运行 脚本像

$ python utils/search.py 'something' 'somewhere'
Traceback (most recent call last):
__file__=utils/search.py                     | __name__=__main__             | __package__=None                
  File "utils/search.py", line 9, in <module>
    import utils.constants as CONSTANTS
ModuleNotFoundError: No module named 'utils'

什么有效

通过 brew uninstall pyenv && rm -Rf ~/.pyenv 删除 pyenv 并完全重新启动终端(采购 .zshrc 似乎还不够)。

$ python --version
Python 2.7.16
$ python3 --version
Python 3.8.5
$ python3 utils/search.py 'something' 'somewhere'
Found what you are looking for. It's working!
$

我不明白的地方

它是相同的 python 版本,但我在其中一个版本中遇到导入错误 - 这有什么意义?

更重要的是:我可以修复它吗 python 3 是终端 python 的默认值,而不必使用 python3

顺便说一句:别名 pythonpython3 不是一个选项 - 试过了,回想起来是失败的。

您似乎没有正确描述您的问题。与 pyenv 无关,但与另一个包的导入方式有关。

关于 import 在 Python 中如何工作的解释:Python Not Finding Module

Python 依赖 sys.path 导入包。它搜索 sys.path 中的路径并尝试找到您想要的包。

据我了解,当您调用 python utils/search.py 时,$PWD/utils 被添加到 sys.path 而不是 $PWD。无法使命令工作,因为模块 utils 未包含在 $PWD/utils 中,但包含在 $PWD.

解决方案touch utils/__init__.py 并调用 python -m utils.search 'something' 'somewhere'.