Shebang无法使用python3

问题描述 投票:16回答:2

我有以下程序:

#!/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

python python-3.x shebang
2个回答
44
投票

一般来说,要注意一些陷阱:

  1. 在脚本上设置可执行标志:chmod u+x test.py
  2. 尝试用前面的点“./”执行,所以调用./test.py否则它可能会执行你的PATH中的其他一些脚本
  3. 还要确保你没有windows line endings,这似乎也阻止了shebang评估。有一些建议,例如in this answer,关于如何转换格式。 如果python3 test.py工作,那么windows行结尾可能是你的问题。
  4. #!/usr/bin/env python3是定义shebang的最佳方式,因为python二进制文件可能安装在其他地方。 env将检查PATH环境以找到二进制文件

编辑:OP的那种错误看起来像Windows行结束给我。我也有它们,虽然有不同的输出


0
投票

你可能会看到ImportError: No module named '_sysconfigdata_m',因为/usr/lib/command-not-found因你的系统而导致the ubuntu bug被打破。

要解决它,运行./test.py,而不是test.py - 当前目录通常不在$PATH中(由于安全原因),因此你应该明确指定路径,否则找不到可能导致尝试运行/usr/lib/command-not-found的命令导致ImportError

如果./test.py失败并出现相同的错误,那么检查没有'\r\v\f' (unexpected whitespace) in the shebangprint(repr(open('test.py', 'rb').readline())))。如果test.py使用Windows换行符,则尝试查找'/usr/local/bin/python3\r'(注意:由于'\r'换行符引起的'\r\n')可能会失败,从而可能触发错误。

© www.soinside.com 2019 - 2024. All rights reserved.