Python shell 在同一虚拟环境中的同一台机器的不同位置上以不同方式工作

Python shell working differently on different location in the same machine inside same virtual environment

我有一个 Linux 机器 (openSuSE) 的云实例,有多个用户。 我已经创建了一个虚拟环境并安装了所有我需要的库(包括 Klein)。

我有两个用户 "a" 和 "b"。 当以 "a" 身份登录并进入 virtualenv 时,当我在主目录中打开 python shell 并键入

import klein

正常导入。

现在,当我将目录更改为

/home/b/

和运行相同(打开python shell,import klein)在同一个virtualenv中,它给我一个错误。

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/a/.local/lib/python3.6/site-packages/klein/__init__.py", line 3, in <module>
    from klein._plating import Plating
  File "/home/a/.local/lib/python3.6/site-packages/klein/_plating.py", line 16, in <module>
    from .app import _call
  File "/home/a/.local/lib/python3.6/site-packages/klein/app.py", line 19, in <module>
    from twisted.internet import endpoints, reactor
  File "/home/a/.local/lib/python3.6/site-packages/twisted/internet/endpoints.py", line 58, in <module>
    from twisted.protocols.tls import TLSMemoryBIOFactory
  File "/home/a/.local/lib/python3.6/site-packages/twisted/protocols/tls.py", line 63, in <module>
    from twisted.internet._sslverify import _setAcceptableProtocols
  File "/home/a/.local/lib/python3.6/site-packages/twisted/internet/_sslverify.py", line 158, in <module>
    verifyHostname, VerificationError = _selectVerifyImplementation()
  File "/home/a/.local/lib/python3.6/site-packages/twisted/internet/_sslverify.py", line 141, in _selectVerifyImplementation
    from service_identity import VerificationError
  File "/home/a/.conda/envs/mm/lib/python3.6/site-packages/service_identity/__init__.py", line 7, in <module>
    from . import cryptography, pyopenssl
  File "/home/a/.conda/envs/mm/lib/python3.6/site-packages/service_identity/cryptography.py", line 16, in <module>
    from .exceptions import SubjectAltNameWarning
  File "/home/a/.conda/envs/mm/lib/python3.6/site-packages/service_identity/exceptions.py", line 21, in <module>
    @attr.s
AttributeError: module 'attr' has no attribute 's'

命令 "which python" 在两个位置给出相同的地址,这是我的 virtualenv python 地址,这应该是预期的。

但是是什么导致了这种奇怪的 python shell 行为。

谢谢

可以有多个不同的 Python 包提供相同的 Python 模块。例如,至少有两个包提供了 attr 模块:

https://pypi.org/project/attr/
https://pypi.org/project/attrs/

可能是您根据要求安装了错误的包。您可以使用 pip freeze.

检查您安装的内容

我解决了,一个非常可耻的原因导致错误。

Twisted 使用的模块之一是 "attr" 模块。我 将我的一个文件命名为 attr.py,这就是导致所有错误的原因。

如果审核没有问题,我本人不会删除这个问题,也许像我这样的人可能会遇到同样的情况。它可能会对他们有所帮助。

Never name your python files same as that of any standard module unless overriding.

此外,如果您的问题仍然存在,那么 Jean 的回答一定会解决它。