Python在git bash命令行中无法运行。

366

在git bash(Windows)中无法运行Python。当我在命令行中输入python时,它会带我到一个空白行,没有像在PowerShell中那样显示已进入Python 2.7.10。它没有给出错误消息,但Python就是不运行。

我已经确认了PATH环境变量中包括c:\python27。还有什么可以检查的吗?


出现此问题的会话如下所示:

user@hostname MINGW64 ~
$ type python
python is /c/Python27/python

user@hostname MINGW64 ~
$ python

...坐在那里没有返回提示符。


2
“什么都没发生”?你甚至没有收到错误提示吗?(也就是说:如果你收到了错误提示,那应该成为你提问的一部分)。 - Charles Duffy
@recursive,Bash确实尊重PATH。(不过它有自己的版本变量)。 - Charles Duffy
17
当我在Python中输入命令时,屏幕上没有出现错误信息,但也没有显示Python正在运行,只有一个空白行。 - Caroline Morris
8
她明确表示了,Charles,没有任何错误信息。Bash只是冻结了。冻结终端就是错误信息。 - Green
6
类似的问题在这里:https://dev59.com/6GYr5IYBdhLWcg3wi6zd,使用`python -i`命令可以解决该问题。 - nngeek
显示剩余2条评论
21个回答

2
除了@Vitaliy Terziev的回答之外,尝试使用touch .bash_profile命令并将别名添加到该文件中。

1
我使用了.bashrc,但是当我打开Git Bash时,出现了一个警告消息,说bashrc存在但没有.bash_profile。我将.bashrc重命名为.bash_profile,现在警告消失了。谢谢。 - JustinDanielson
.bashrc vs .bash_profile.bashrc和.bash_profile是Bash shell的两个配置文件。它们都用于设置环境变量,别名和其他shell选项。.bashrc在每次打开新的终端窗口时都会加载,而.bash_profile只在登录时加载一次。如果您需要在所有终端窗口中使用相同的环境变量和别名,则应将其添加到.bashrc文件中。如果您只需要在登录时设置一次,则应将其添加到.bash_profile文件中。通常,.bash_profile文件还会调用.bashrc文件以确保在登录时也加载.bashrc文件中的内容。 - djvg

2
更新:我刚刚几秒前安装了最新的Git for Windows,并且他们现在有一个复选框可以修复Git Bash中的 winpty Python 问题!在这里查看:

enter image description here

原始的,可能更可靠的答案:

Python在Git Bash中无法工作(它只是卡住或永远冻结);以及让Linux的哈希标记在Windows中工作

请注意,当我尝试运行Python时,如果Git Bash卡住,我无法用Ctrl + CCtrl + D来终止它。我必须关闭Git Bash终端才能终止它。:(

对于我们从Linux转到Windows的人来说,你可能也习惯在命令行中调用python3,并在你的Python文件顶部使用一个哈希标记,看起来像这样:

#!/usr/bin/env python3

...这样你只需使用chmod +x my_script.py将文件设为可执行,然后直接运行./my_script.py,而不必使用python3 my_script.py

因此,让我们解决上述所有问题。

快速总结:

  1. 将以下两个别名和路径修复添加到你的~/.bashrc文件的末尾,这样你就可以在Git Bash中交互地运行pythonpython3
  2. alias python='winpty python'
    alias python3='winpty python'
    
    # 如果存在用户私有bin目录,则将其添加到PATH中
    if [ -d "$HOME/bin" ] ; then
        PATH="$HOME/bin:$PATH"
    fi
    
  3. 添加此~/bin/python3可执行包装器,以便你可以在Python脚本中使用#!/usr/bin/env python3哈希解释器指令:
  4. #!/usr/bin/env bash
    
    winpty python "$@"
    
  5. 关闭并重新打开所有的Git Bash终端,或在每个终端中输入. ~/.bashrc。然后执行以下步骤:
  6. # 确保你的别名存在
    alias python   # 期望输出:`alias python='winpty python'`
    alias python3  # 期望输出:`alias python3='winpty python'`
    
    # 确保你的`python3`可执行文件存在
    which python3  # 期望输出:`/c/Users/myusername/bin/python3`
    
  7. 测试:
  8. # 这两个命令可以交互地打开Python 3
    # - 然后输入`exit()`退出
    python
    python3
    

    对于这个hello_world.py脚本:

    #!/usr/bin/env python3
    
    print("Hello world.")
    

    以下命令都可以运行它:

    # 运行Python 3的这三种方式都能执行`hello_world.py`
    # 1. Windows风格
    python hello_world.py 
    # 2. Linux风格
    python3 hello_world.py 
    # 3. Hash-bang Linux风格
    ./hello_world.py 
    
如果你能理解并完成了上述所有步骤,那么你已经完成了。否则,请继续阅读以获取更多详细信息和信息,包括故障排除。
详情
步骤1:在Git Bash终端中使python和python3可交互使用
首先,在你的Git Bash终端中让python和python3都能够交互地工作,并且不会永远挂起或冻结,请运行以下命令:
# Add interactive `python` and `python3` aliases. 
# - NB: it is *not* a mistake that both aliases point to `python`. That is how
#   it is supposed to be!
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终端中交互式运行pythonpython3。太棒了!关于为什么需要通过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添加到我们的路径中:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

创建~/bin目录:
mkdir -p ~/bin

重新加载你的~/.bashrc文件,或者关闭并重新打开所有的Git Bash终端。如果你不知道"source"是什么意思,可以在这里阅读我的回答:source和export有什么区别?
. ~/.bashrc

现在在路径 ~/bin/python3 创建一个文件,并将其粘贴进去。完成后保存并关闭文件。

#!/usr/bin/env bash

winpty python "$@"

确保它是可执行的:
chmod +x ~/bin/python3

现在,创建一个测试文件。创建一个名为hello_world.py的文件,并将以下内容粘贴到其中:
#!/usr/bin/env python3

print("Hello world.")

将文件设置为可执行,并直接运行它:
# make it executable
chmod +x hello_world.py

# run it
./hello_world.py 

你会看到:

你好,世界。

完成!现在你有三种方法来运行这个脚本!:

# 1. Windows style
python hello_world.py 

# 2. Linux style
python3 hello_world.py 

# 3. Hash-bang Linux style
./hello_world.py 

这一切是如何运作的?

确切地说,这一切是有点棘手的。

首先,当你手动运行pythonpython3来获取一个交互式会话时,或者运行python hello_world.pypython3 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)`
解决方案:老实说,我现在记不起我是怎么得到这个错误的了,但这是我在找到解决方案之前遇到的众多错误之一,详细解释请参考上面的回答。

其他参考资料

  1. 我在这里@Vitaliy Terziev的回答中了解到了alias python='winpty python.exe'的别名。

1
很好的解释。点赞了。而且 Git 2.42 版本即将在 Windows 平台上发布。 - VonC

1

对于使用gitbash作为默认终端的python版本3.7.3在vscode中,我一直在处理这个问题,然后按照@Vitaliy Terziev的建议将别名添加到.bashrc,但是需要以下规范:

alias python=’“/c/Users/my user name/AppData/Local/Programs/Python/Python37/python.exe”’

请注意,由于“我的用户名”中含有空格,因此结合了单引号和双引号。

对我来说,在vscode中,"winpty"无法解析python路径。


1

使用命令PY代替Python。调用解释器(python.org)。


1
我正在使用Windows 10上的Visual Studio Code通过MINGW64,并尝试安装node-sass(需要python2)。 我遵循了Github上的felixrieseberg/windows-build-tools #56,解决了我的问题。
这是一个特殊情况,但我发帖是为了以防万一有人遇到同样的问题: npm --add-python-to-path='true' --debug install --global windows-build-tools 这将安装Python和其他所需的构建工具到%USERPROFILE%\.windows-build-tools\python27

1
我知道这是一个旧帖子,但我在运行Python 3.8.5和Git 2.28.0.windows.1的Windows 10上遇到了这个问题。不知何故,我安装了几个不同的2.7x版本的Python。我删除了所有版本的Python(包括3x和2x),下载了官方安装程序here,安装了3.8.5最新版本(只使用默认设置),将Python 3.8.5安装在以下位置:C:\Users\(我的用户名)\AppData\Local\Programs\Python\Python38。
然后为了使我的git bash shell中的python命令工作,我必须手动添加Python38路径到我的路径变量中,按照这里列出的说明进行操作。需要注意的是,在第一个模态窗口的底部,Python安装程序会询问是否要将python路径添加到PATH环境变量中。我勾选了旁边的复选框,但它实际上没有添加路径,因此需要手动将路径添加到PATH环境变量中。
现在,使用我的gitbash shell,我可以浏览到包含python脚本的目录,并只需键入python theScriptName.py即可轻松运行。
我想发表这篇文章,因为这就是我所做的一切,以使我的gitbash shell允许我运行python脚本。我认为可能已经有一些更新,因此我不需要执行这里列出的任何其他解决方案。无论如何,如果您在Windows 10机器上的gitbash shell中运行python脚本时遇到问题,请尝试另一种方法。
祝您愉快。

尝试在REPL模式下运行Python而不指定脚本。 - Dmitry Kuzminov
最新的安装程序有一个选项可以将其添加到PATH。 - Andre

0

这个问题的另一个例子是在Windows(使用git版本2.19.0.windows.1)中从git bash(MINGW64,Mintty)使用AWS Elastic Beanstalk命令行界面(awsebcli,eb cli)。

我发帖只是因为我花了一段时间才找到这里,搜索eb-cli特定问题。

eb initeb config save这样需要用户输入的命令,似乎会导致冻结/挂起。实际上,我猜控制台没有更新请求用户输入的文本。此外,eb deploy仅在命令完成后更新控制台文本,因此在完成之前我看不到进度更新。

git for windows release notes(v2.19.0)和Xun Yang's answer中所述,解决方法是运行

winpty eb <command>(而不是只有eb <command>

git for windows issue中所建议的,另一种选择是在安装Git时使用Windows本地控制台而不是mintty。


0

对我而言,以下这个别名是在上面这些很棒的答案中提到的: (我正在使用anaconda,所以首先找到python路径,然后将其添加到git bash的别名中)。 1. 在anaconda终端上运行:where python 2. 在git bash上运行:alias python='winpty "C:\ProgramData\Anaconda3\envs\your_env_name\python.exe"' 3. 完成。Python已经通过别名在git Bash中定义好了。

感谢(Vitaliy Terziev & hygull)提供的非常有用的答案。


0

如果你运行Windows PowerShell命令时出现错误,错误记录将被附加到名为$error的“自动变量”中。

你可以使用$error变量在同一PowerShell会话中查找错误。

$Error变量保存了一组信息,因此使用$Error[0]可以获取到你的错误消息对象。同时,$Error[0]变量将保存直到PowerShell会话结束的最后一个错误消息。


你能否扩展你的回答?或者加上一个例子吗? - DannyDannyDanny

0
  1. python.exe -i 可以工作,但在发送 "^Z" (CTRL+Z) 退出交互模式时会出现问题。因此,在 Git Bash for Windows 中使用 winpty python.exe 更好。

  2. 使用 ~/bin 目录创建一个包装/引用文件(如 ~/bin/python),该文件将在任何地方都可以访问(您可以使用不同版本的引用,如 ~/bin/python37)。
    文件内代码:

#!/usr/bin/env bash
# maybe declare env vars here like
# export PYTHONHOME=/c/Users/%USERNAME%/.python/Python36
# export PATH="${PATH}:/c/Users/%USERNAME%/.python/Python36"

# replace %USERNAME%,
# or use "~" instead of "/c/Users/%USERNAME%" if it works
winpty /c/Users/%USERNAME%/.python/Python36/python.exe ${@}

我不喜欢这些“神奇”的别名,你总是忘记它来自哪里,有时会导致一些问题。

  1. 使用~/bin/python文件和-i参数:
#!/usr/bin/env bash
if [ -z "${@}" ]; then
    # empty args, use interactive mode
    /c/Users/%USERNAME%/.python/Python36/python.exe -i
else
    /c/Users/%USERNAME%/.python/Python36/python.exe ${@}
fi

19480756 [sig] bash 2740! sigpacket::process: Suppressing signal 18 to win32 process (pid 14820) — response example after sending ^Z with interactive mode ran by python.exe -i - Kirby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接