Shebang在python3中无效

53 投票
5 回答
97629 浏览
提问于 2025-04-17 21:06

我有一个这样的程序:

#!/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 个回答

1

另一个可能的原因是文件开头有一个叫做字节顺序标记(BOM)的东西,特别是当文件使用Unicode编码时。

我在写Python脚本时遇到的问题就是这个BOM,因为我的文件是用UTF-8编码的。我通过我的文本编辑器Geany去掉了这个BOM,不过Notepad++也可以去掉它。去掉后,我就能用命令./myscript.py来运行我的脚本了。

引用维基百科的话:

Unicode标准允许在UTF-8中使用BOM,但并不要求或推荐使用它。因为在UTF-8中,字节顺序没有意义[...]

1

你可能会看到 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' 换行符)很可能会失败,这也可能导致错误的发生。

2

我也遇到过Windows换行的问题。用像VI这样的Linux编辑器写同样的程序,解决了我的问题。此外,我还使用了"less"命令,这让我能看到Windows的换行符。

5

如果你的Python脚本在Windows电脑上运行过,建议你试着清理一下文件中的换行符,可以用下面的代码:

$ dos2unix programmer.py
90

一般来说,要注意一些常见的问题:

  1. 给脚本设置可执行权限:可以用命令 chmod u+x test.py 来实现。

  2. 尝试用点号开头来执行,也就是用 ./test.py 来运行,这样可以避免执行到你 PATH 中的其他脚本。

  3. 确保没有Windows格式的换行符,这可能会导致脚本的开头部分(shebang)无法正常识别。有一些方法可以转换格式,比如在这个回答中提到的。如果用 python3 test.py 可以正常运行,那就说明问题可能出在Windows换行符上。

  4. #!/usr/bin/env python3 是定义shebang的最佳方式(也就是在脚本的第一行使用这个),因为Python的安装位置可能不一样。env 会检查 PATH 环境变量来找到Python的可执行文件。

  5. 正如@ShaileshKumarMPatel在评论中提到的,确保没有错误的行开头(比如颜色字符等)。

编辑:我觉得原作者的错误看起来像是Windows换行符的问题。我也遇到过类似的情况,不过输出不同。

撰写回答