Shebang在python3中无效
我有一个这样的程序:
#!/usr/local/bin/python3
print("Hello")
通过终端我输入 test.py
,结果是:
Traceback (most recent call last):
File "/usr/lib/python3.3/site.py", line 629, in <module>
main()
File "/usr/lib/python3.3/site.py", line 614, in main
known_paths = addusersitepackages(known_paths)
File "/usr/lib/python3.3/site.py", line 284, in addusersitepackages
user_site = getusersitepackages()
File "/usr/lib/python3.3/site.py", line 260, in getusersitepackages
user_base = getuserbase() # this will also set USER_BASE
File "/usr/lib/python3.3/site.py", line 250, in getuserbase
USER_BASE = get_config_var('userbase')
File "/usr/lib/python3.3/sysconfig.py", line 610, in get_config_var
return get_config_vars().get(name)
File "/usr/lib/python3.3/sysconfig.py", line 560, in get_config_vars
_init_posix(_CONFIG_VARS)
File "/usr/lib/python3.3/sysconfig.py", line 432, in _init_posix
from _sysconfigdata import build_time_vars
File "/usr/lib/python3.3/_sysconfigdata.py", line 6, in <module>
from _sysconfigdata_m import *
ImportError: No module named '_sysconfigdata_m'
但是如果我输入 python3 test.py
,它就能正常工作,结果是:
Hello
附注:输入 which python3
的结果是 /usr/local/bin/python3
5 个回答
另一个可能的原因是文件开头有一个叫做字节顺序标记(BOM)的东西,特别是当文件使用Unicode编码时。
我在写Python脚本时遇到的问题就是这个BOM,因为我的文件是用UTF-8编码的。我通过我的文本编辑器Geany去掉了这个BOM,不过Notepad++也可以去掉它。去掉后,我就能用命令./myscript.py来运行我的脚本了。
引用维基百科的话:
Unicode标准允许在UTF-8中使用BOM,但并不要求或推荐使用它。因为在UTF-8中,字节顺序没有意义[...]
你可能会看到 ImportError: No module named '_sysconfigdata_m'
这个错误,是因为你系统里的 /usr/lib/command-not-found
出了问题,这个问题是由 Ubuntu的一个bug 引起的。
要解决这个问题,你需要运行 ./test.py
,而不是直接运行 test.py
。这是因为当前目录通常不在 $PATH
里(出于安全考虑),所以你需要明确指定路径,否则系统找不到这个命令,可能会尝试去运行 /usr/lib/command-not-found
,这就会导致 ImportError
的错误。
如果 ./test.py
运行时还是出现同样的错误,那就检查一下文件的开头(shebang)里有没有 '\r\v\f'
这样的意外空白字符(可以用 print(repr(open('test.py', 'rb').readline()))
来查看)。如果 test.py
使用了Windows格式的换行符,那么系统在寻找 '/usr/local/bin/python3\r'
时(注意:'\r'
是因为 '\r\n'
换行符)很可能会失败,这也可能导致错误的发生。
我也遇到过Windows换行的问题。用像VI这样的Linux编辑器写同样的程序,解决了我的问题。此外,我还使用了"less"命令,这让我能看到Windows的换行符。
如果你的Python脚本在Windows电脑上运行过,建议你试着清理一下文件中的换行符,可以用下面的代码:
$ dos2unix programmer.py
一般来说,要注意一些常见的问题:
给脚本设置可执行权限:可以用命令
chmod u+x test.py
来实现。尝试用点号开头来执行,也就是用
./test.py
来运行,这样可以避免执行到你PATH
中的其他脚本。确保没有Windows格式的换行符,这可能会导致脚本的开头部分(shebang)无法正常识别。有一些方法可以转换格式,比如在这个回答中提到的。如果用
python3 test.py
可以正常运行,那就说明问题可能出在Windows换行符上。#!/usr/bin/env python3
是定义shebang的最佳方式(也就是在脚本的第一行使用这个),因为Python的安装位置可能不一样。env
会检查PATH
环境变量来找到Python的可执行文件。正如@ShaileshKumarMPatel在评论中提到的,确保没有错误的行开头(比如颜色字符等)。
编辑:我觉得原作者的错误看起来像是Windows换行符的问题。我也遇到过类似的情况,不过输出不同。