更新:我刚刚几秒前安装了最新的Git for Windows,并且他们现在有一个复选框可以修复Git Bash中的 winpty Python 问题!在这里查看:
![enter image description here](https://istack.dev59.com/7FQ7N.webp)
原始的,可能更可靠的答案:
Python在Git Bash中无法工作(它只是卡住或永远冻结);以及让Linux的哈希标记在Windows中工作
请注意,当我尝试运行Python时,如果Git Bash卡住,我无法用Ctrl + C或Ctrl + D来终止它。我必须关闭Git Bash终端才能终止它。:(
对于我们从Linux转到Windows的人来说,你可能也习惯在命令行中调用python3
,并在你的Python文件顶部使用一个哈希标记,看起来像这样:
#!/usr/bin/env python3
...这样你只需使用chmod +x my_script.py
将文件设为可执行,然后直接运行./my_script.py
,而不必使用python3 my_script.py
。
因此,让我们解决上述所有问题。
快速总结:
- 将以下两个别名和路径修复添加到你的
~/.bashrc
文件的末尾,这样你就可以在Git Bash中交互地运行python
或python3
:
alias python='winpty python'
alias python3='winpty python'
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
- 添加此
~/bin/python3
可执行包装器,以便你可以在Python脚本中使用#!/usr/bin/env python3
哈希解释器指令:
winpty python "$@"
- 关闭并重新打开所有的Git Bash终端,或在每个终端中输入
. ~/.bashrc
。然后执行以下步骤:
alias python
alias python3
which python3
- 测试:
python
python3
对于这个hello_world.py
脚本:
print("Hello world.")
以下命令都可以运行它:
python hello_world.py
python3 hello_world.py
./hello_world.py
如果你能理解并完成了上述所有步骤,那么你已经完成了。否则,请继续阅读以获取更多详细信息和信息,包括故障排除。
详情
步骤1:在Git Bash终端中使python和python3可交互使用
首先,在你的Git Bash终端中让python和python3都能够交互地工作,并且不会永远挂起或冻结,请运行以下命令:
echo -e "\n" >> ~/.bashrc
echo "alias python='winpty python'" >> ~/.bashrc
echo "alias python3='winpty python'" >> ~/.bashrc
这相当于创建一个
~/.bashrc
文件,并将这些别名添加到文件的底部。
alias python='winpty python'
alias python3='winpty python'
现在关闭并重新打开您的Git Bash终端以应用这些更改。
您现在可以在Git Bash终端中交互式运行python
或python3
。太棒了!关于为什么需要通过winpty
调用python
,请参考@VonC的答案:
Winpty是一个兼容性层,允许您从Linux终端运行Windows控制台应用程序。
- 当您从Linux交叉编译程序到Windows时,生成的二进制文件将是一个可以直接从Linux终端运行的Windows控制台应用程序,无需使用
winpty
。
- 然而,如果您在Windows上本地构建程序,生成的二进制文件将是一个无法从Linux终端运行的Windows GUI应用程序。
要从Linux终端运行Windows GUI应用程序,您需要使用winpty
。
第2步:使#!/usr/bin/env python3
哈希-解析也起作用
为了使这个工作正常,我们需要将一个自定义的
~/bin/python3
可执行的Bash包装器添加到我们的PATH中。
打开你的
~/.bashrc
文件,并在文件底部添加以下内容,以便在该目录存在时自动将
~/bin
添加到我们的路径中:
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
创建
~/bin
目录:
mkdir -p ~/bin
重新加载你的
~/.bashrc
文件,或者关闭并重新打开所有的Git Bash终端。如果你不知道"source"是什么意思,可以在这里阅读我的回答:
source和export有什么区别?。
. ~/.bashrc
现在在路径 ~/bin/python3
创建一个文件,并将其粘贴进去。完成后保存并关闭文件。
winpty python "$@"
确保它是可执行的:
chmod +x ~/bin/python3
现在,创建一个测试文件。创建一个名为
hello_world.py
的文件,并将以下内容粘贴到其中:
print("Hello world.")
将文件设置为可执行,并直接运行它:
chmod +x hello_world.py
./hello_world.py
你会看到:
你好,世界。
完成!现在你有三种方法来运行这个脚本!:
python hello_world.py
python3 hello_world.py
./hello_world.py
这一切是如何运作的?
确切地说,这一切是有点棘手的。
首先,当你手动运行python
或python3
来获取一个交互式会话时,或者运行python hello_world.py
或python3 hello_world.py
来运行一个文件时,它会访问你在~/.bashrc
文件中定义的Bash别名,并代之以运行winpty python
。这对于在Git Bash中正确工作的调用是必需的,原因已经在@VonC在这里的回答中解释过了。
Bash别名仅在用户(比如你自己)直接在Git Bash终端中运行别名时才可用。它们对系统和系统启动的任何其他进程都不可用。因此,当你运行`./hello_world.py`时,`#!/usr/bin/env python3`哈希-帮助找不到并运行你的`python3`别名。相反,它会找到并运行你的`~/bin/python3`可执行的Bash包装器,该包装器还通过`winpty`执行Python调用,这是必需的。
故障排除:如果你没有正确执行上述操作,可能会出现各种错误。
问题:在Git Bash终端中运行`python`或`python3`时,会一直卡住。
解决方案:你忘记添加两个别名来调用`winpty python`了。请添加它们。
问题:运行`python3`会打开Microsoft Store并尝试安装Python。
解决方案:你忘记创建`alias python3='winpty python'`别名了。
问题:哈希标记不起作用。运行`./hello_world.py`会显示以下信息:
Python未找到;请运行无参数命令从Microsoft Store安装,或者在“设置”>“管理应用程序执行别名”中禁用此快捷方式。
解决方案:你忘记创建`~/bin/python`包装可执行文件。如果已经创建,请确保它是可执行的。如果这两件事都做了,请确保`~/bin`在你的PATH环境变量中。请参考上面的内容,在`~/.bashrc`中添加代码块来实现。
问题:哈希标记不起作用。运行`./hello_worl.py`会显示以下信息:
`/usr/bin/env: ‘python3’: No such file or directory`
你已经关闭了Windows的`python.exe`和`python3.exe`应用程序执行别名(如
这里所述),但你没有创建`~/bin/python`包装可执行文件。
解决方案:你忘记创建`~/bin/python`包装可执行文件。如果已经创建,请确保它是可执行的。如果这两件事都做了,请确保`~/bin`在你的PATH环境变量中。请参考上面的内容,在`~/.bashrc`中添加代码块来实现。
问题:你遇到了以下错误:
`winpty: error: cannot start '"C:/Program Files/WindowsApps/Microsoft.DesktopAppInstaller_1.20.1881.0_x64__8wekyb3d8bbwe/AppInstallerPythonRedirector.exe"': Access is denied. (error 0x5)`
解决方案:老实说,我现在记不起我是怎么得到这个错误的了,但这是我在找到解决方案之前遇到的众多错误之一,详细解释请参考上面的回答。
其他参考资料
- 我在这里@Vitaliy Terziev的回答中了解到了
alias python='winpty python.exe'
的别名。