如何避免Python脚本被意外当作Bash脚本执行?
解决Bash执行Python脚本的意外问题
一、避免忘记加shebang导致的文件覆盖问题
当你没加shebang直接运行./script.py时,Bash会把它当成shell脚本执行,里面的import numpy as np会被解析成调用ImageMagick的import命令,把输出保存到名为np的文件,这就是覆盖的根源。可以用这些办法规避:
- 给编辑器加自动模板:在常用编辑器(比如VS Code、Vim)里设置新建
.py文件时自动插入#!/usr/bin/env python3,从源头避免漏加shebang。 - 直接用Python解释器运行:放弃
./script.py的方式,改成python3 script.py执行脚本,不管有没有shebang,都会用Python解析,不会触发shell的错误解析。 - 写个校验小脚本:自己写个简单的shell脚本,帮你检查
.py文件是否有shebang,没有的话提示你用Python执行:
之后用# 保存为check_py.sh,执行chmod +x check_py.sh赋予权限 if ! grep -q "^#!/usr/bin/env python3" "$1"; then echo "警告:脚本无shebang,是否用python3执行?(y/n)" read ans [ "$ans" = "y" ] && python3 "$1" || echo "已取消执行" else "$1" fi./check_py.sh script.py来运行脚本,多一层校验。
二、阻止Bash执行.py扩展名的脚本
完全可以实现,两种常用方法:
- 修改Bash的
PATHEXT变量:Bash通过PATHEXT识别可执行的脚本扩展名,默认为空时会尝试执行任何有执行权限的文件。在~/.bashrc或~/.bash_profile里添加一行:
这样Bash只会把带PATHEXT=".sh:.bash".sh、.bash扩展名的文件当成shell脚本执行,.py文件即使有执行权限,直接./script.py会提示"command not found",必须用Python解释器才能运行。 - 去掉.py文件的执行权限:如果不需要直接执行
.py文件,就不要给它加+x权限,执行chmod -x script.py后,再用./script.py会提示"permission denied",强迫你用python3 script.py的正确方式运行。
内容的提问来源于stack exchange,提问作者user1537366
相关产品推荐
相关产品推荐

