没有使用sudo命令导致的语法错误

4
当我不使用sudo执行我的脚本时:
$ python main.py 
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    import irc
  File "/Users/judgej4/twitchchat/irc.py", line 3, in <module>
    import asyncio
  File "/Users/judgej4/anaconda3/lib/python3.6/site-packages/asyncio/__init__.py", line 21, in <module>
    from .base_events import *
  File "/Users/judgej4/anaconda3/lib/python3.6/site-packages/asyncio/base_events.py", line 18, in <module>
    import concurrent.futures
  File "/Users/judgej4/anaconda3/lib/python3.6/site-packages/concurrent/futures/__init__.py", line 8, in <module>
    from concurrent.futures._base import (FIRST_COMPLETED,
  File "/Users/judgej4/anaconda3/lib/python3.6/site-packages/concurrent/futures/_base.py", line 381
    raise exception_type, self._exception, self._traceback
                        ^
SyntaxError: invalid syntax

当我使用sudo执行时,语法错误消失了,并且脚本可以正常执行。

我该如何调试它?

编辑 请注意,我对每个版本都使用相同的Python版本:

$ which python
/Users/judgej4/anaconda3/bin/python
$ sudo which python
/Users/judgej4/anaconda3/bin/python

我注意到PYTHONPATH包含了一些常规用户的目录,而sudo则没有:

/Users/judgej4/anaconda3/lib/python3.6/site-packages
/usr/local/Cellar/apache-spark/2.2.1/libexec/python

看起来错误是来自第一个目录。

我可以从我的PYTHONPATH中删除该目录,但我更愿意解决问题,这个问题似乎与anaconda有关。

编辑2

$ python --version
Python 3.6.3 :: Anaconda custom (64-bit)
$ sudo python --version
Python 3.6.3 :: Anaconda custom (64-bit)

EDIT 3

$ command -v python
/Users/judgej4/anaconda3/bin/python
$ sudo command -v python
/Users/judgej4/anaconda3/bin/python

6
运行 sudo python --versionpython --version 命令,你可能会发现没有 sudo 的那个是 Python 2 版本。 - metatoaster
你应该发布 command -v 的输出,而不是 which。另请参见 从Bash脚本检查程序是否存在 - jww
两者都是Python 3.6.3。 - Joseph Judge
3个回答

3
问题不在于您的Python解释器,而在于您的Python库设置。请查看引发异常的那一行:
File "/Users/judgej4/anaconda3/lib/python3.6/site-packages/concurrent/futures/_base.py", line 381
    raise exception_type, self._exception, self._traceback

这是Python 2代码,但它在python3.6/site-packages/...下。看起来你已经在Python3中安装了futures包,这是一个Python 2包,是一个不必要的后移版。你提到根目录的PYTHONPATH没有包含...
/Users/judgej4/anaconda3/lib/python3.6/site-packages

这就是为什么您的脚本在使用sudo时能够正常工作:它获取了concurrent的发行版本,该版本位于/Users/judgej4/anaconda3/lib/python3.6/而不是不兼容的futures版本,后者位于/Users/judgej4/anaconda3/lib/python3.6/site-packages中。

如果您删除/Users/judgej4/anaconda3/lib/python3.6/site-packages/concurrent/目录,这个问题就会得到解决。


就是这样了。感谢您的回复。 - Joseph Judge
不用谢!请考虑接受答案(点击复选框),这样如果其他人遇到类似的问题,他们可以更容易地看到解决方案。 - Nathan Vērzemnieks

2
这个错误可能是由于使用Python 3.6执行Python 2代码引起的。也许你的配置看起来像这样:
- root用户的`python`命令是`python2`的别名 - 普通用户的`python`命令运行的是`python3.6`
如果是这样的话,你应该使用`python2`命令来避免这个错误:
- `sudo python2 main.py` - `python2 main.py`

$ which python /Users/judgej4/anaconda3/bin/python $ sudo which python /Users/judgej4/anaconda3/bin/python - Joseph Judge
@JosephJudge - 不要使用 which。另请参见如何从Bash脚本中检查程序是否存在 - jww
仔细查看回溯信息。这是错误的问题和错误的解决方案。 - Nathan Vērzemnieks

0

sudo 看起来是使用不同版本的 Python 执行您的脚本 - 以下命令将确认此事:

sudo type python

type python

我预计输出结果会有所不同,第一条命令将打印出 Python 2 安装路径。


which 可以展示与 shell 使用的不同解释器(如果有别名或函数,或者如果 shell 仍在使用旧的 PATH 查找,但实际文件位置已更改)。对于非 sudo 情况,type pythonwhich python 更准确。 - Charles Duffy
还可以参考如何从Bash脚本中检查程序是否存在。建议避免使用which命令。 - jww
公正的观点 - 我忽略了别名等。编辑以提供更准确的答案。 - stuartgm
“sudo type” 并不一定有效,因为 “type” 是一个 shell 内置命令而不是外部可执行文件(在常见情况下,“sudo” 直接调用可执行文件而不是通过内置命令)——这就是为什么我建议专门针对非 “sudo” 测试使用它的原因。 - Charles Duffy
在这种情况下,解释器确实是相同的 - 关键在于PYTHONPATH。 - Nathan Vērzemnieks

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