Python环境设置看起来很复杂,而且无法解决

egmofgnx  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(116)

我已经做了大约三年的开发人员,主要从事TypeScript和Node.js的工作。我试图通过学习Python来扩展我的技能(并最终扩展我对computer visionmachine learning(ML)等的学习),但我对试图让Python在我的机器上一致地工作感到非常沮丧。我肯定做错了什么,但我真的不明白是什么。
我在使用ML包(TensorFlowWhisperOpenCV)时经常遇到这些问题(尽管我最终能够解决这个问题),所以我不知道它是否与M1对某个常见依赖项的支持有关。
我目前对Python的理解是:

  • M1对Python的支持最多是依赖于版本的。
  • venv是我需要使用的唯一环境管理器
  • 我应该使用pyenv来安装Python版本,这样就不会与操作系统安装的Python(macOS依赖项)冲突。

我将使用我正在做的最新项目作为示例。

我的机器和环境

Mac Pro M1,macOS v12.6(Monterey)
Pyenv 2.3.9
简体中文
Fish shell版本3.5.1
我开始一个项目的一般工作流程:
1.使用venv python3 -m venv <some_environment_name>创建虚拟环境
1.使用Visual Studio Code打开创建的目录,并激活虚拟环境

  • 这是我遇到的第一个问题,它似乎是持久的。
source /Users/paal/src/whisper_transcription

字符串
输出量:

/bin/activate.fish
functions: Function '_old_fish_prompt' does not exist

~/src/whisper_transcription/bin/activate.fish (line 18):
        functions -c _old_fish_prompt fish_prompt
        ^
in function 'deactivate' with arguments 'nondestructive'
        called on line 30 of file ~/src/whisper_transcription/bin/activate.fish
from sourcing file ~/src/whisper_transcription/bin/activate.fish

(Type 'help functions' for related documentation)
functions: Function 'fish_prompt' does not exist

~/src/whisper_transcription/bin/activate.fish (line 47):
    functions -c fish_prompt _old_fish_prompt
    ^
from sourcing file ~/src/whisper_transcription/bin/activate.fish

(Type 'help functions' for related documentation)
fish: Unknown command: _old_fish_prompt
~/src/whisper_transcription/bin/activate.fish (line 71):
            _old_fish_prompt
            ^
in function 'fish_prompt'
in command substitution
(whisper_transcription)


因此,为了解决这个问题,我将以下 if 语句添加到 * fish.config * 文件中。

if type -q $program
    _old_fish_prompt
end


看看GitHub的问题,这似乎是Fish shell的一个持久性问题,这似乎至少暂时解决了它。
或者,我只是切换到Z shell(可执行zsh)。
好吧,解决了这个问题,我继续前进。环境已经激活,我现在使用的是Z shell,我可以成功地运行一个Python脚本,将“hello world”打印到控制台。
然后是安装任何软件包的噩梦。似乎我开始的任何项目都有一些奇怪的兼容性问题。M1处理器之间、Python版本之间、构建不正确等。
比如说,

import whisper
... # The rest of the file


这与任何其他代码,甚至 * 本身 * 抛出以下错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import whisper
  File "/Users/paal/src/whisper_transcription/lib/python3.7/site-packages/whisper/__init__.py", line 12, in <module>
    from .decoding import DecodingOptions, DecodingResult, decode, detect_language
  File "/Users/paal/src/whisper_transcription/lib/python3.7/site-packages/whisper/decoding.py", line 514
    if prefix := self.options.prefix:
               ^
SyntaxError: invalid syntax


这似乎是Python版本的问题。据我所知,:=运算符直到Python 3.8才是有效的语法。Whisper(PyTorch)only seems to be supported up to version 3.7.9
所以,你可以看到,似乎我只是在这些奇怪的循环问题中结束,我想使用的一些包的依赖性不受平台或当前Python版本的支持,它们似乎基本上无法解决(至少以我目前对Python的了解)。
为什么这看起来如此复杂?我显然在这里做错了什么,显然我已经超出了我的舒适和知识区,但这些问题让人感到非常令人生畏和不透明,并且很难以任何一致或清晰的方式实际解决这个问题。
有没有一种方法可以让这个问题变得更加清晰?M1芯片上的Python开发目前就这么失败吗?我怎样才能越过这些看似基本的问题,开始真正的学习呢?
我不一定要在这里寻找这个特定问题的解决方案,但是如果有关于环境管理和如何使事情可靠地工作的一般建议,我很好故障排除。我只是觉得每次我开始尝试学习,我最终在这些兔子洞,需要几个小时和几个小时来解决,有时甚至没有真正解决的事情。

3pvhb19x

3pvhb19x1#

除了使用venv创建虚拟环境,您还可以使用更复杂的工具,如 Poetry,它使您能够以更好的方式管理环境。
我一直在从事Python项目,有一件事很糟糕,那就是与其他主机的兼容性问题。这就是诗歌进入画面的地方。有一些关于诗歌的视频可以参考。
我必须提到的一个很棒的特性是 * 它告诉你哪个包版本与你的Python版本兼容 *。这节省了大量的时间在互联网上搜索特定的包版本,与我们的Python版本。
每次我在一个新项目上工作时,我通常只使用Poetry在该项目中创建一个新的虚拟环境。因此,当我想将此项目交给其他人或在其他主机上运行时,我将项目与项目目录中的虚拟环境一起提供。这样他们就可以从我们提供的虚拟环境中运行项目,而不必在他们的系统上安装所有依赖项。
即使是高级用户,也可以选择Docker,将应用程序和内容容器化,我自己现在也在学习。但是看看您的场景,我建议使用Poetry包来管理虚拟环境及其依赖项。
Here is a great tutorial on the Poetry package

相关问题