python - 从 cat 重定向会导致不同的 python 解释器行为

标签 python python-3.x paramiko io-redirection pythoninterpreter

我不确定如何最好地解决或查询此问题。我有一个简单的程序,它使用 fs.sshfs 模块,该模块依赖于 paramiko 以及 cryptogaphy.utils。来 self 的 virtualenvpython 版本 3.5.2

(venv) $ cat tump.py
from fs.sshfs import SSHFS

remote = SSHFS('rushmore')
print(*remote.listdir('.'), sep='\n')

我的环境安装了以下模块。

(venv) $ pip freeze
appdirs==1.4.3
asn1crypto==0.24.0
bcrypt==3.1.4
cffi==1.11.5
cryptography==2.2.2
fs==2.0.21
fs.sshfs==0.8.0
idna==2.6
paramiko==2.4.1
pkg-resources==0.0.0
pyasn1==0.4.2
pycparser==2.18
PyNaCl==1.2.1
pytz==2018.4
six==1.11.0
typing==3.6.4

当我直接在文件上调用 python 时,我收到针对 getargspecAttributeError

(venv) $ python tump.py
Traceback (most recent call last):
  File "tump.py", line 1, in <module>
    from fs.sshfs import SSHFS
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/fs/sshfs/__init__.py", line 7, in <module>
    from .sshfs import SSHFS
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/fs/sshfs/sshfs.py", line 13, in <module>
    import paramiko
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/paramiko/__init__.py", line 22, in <module>
    from paramiko.transport import SecurityOptions, Transport
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/paramiko/transport.py", line 34, in <module>
    from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/ciphers/__init__.py", line 7, in <module>
    from cryptography.hazmat.primitives.ciphers.base import (
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/cryptography/hazmat/primitives/ciphers/base.py", line 11, in <module>
    from cryptography import utils
  File "/mnt/max/home/robinsph/git/HCPVaTT/venv/lib/python3.5/site-packages/cryptography/utils.py", line 85, in <module>
    signature = inspect.getargspec
AttributeError: module 'inspect' has no attribute 'getargspec'

当我使用重定向到文件描述符来调用时,

(venv) $ python <(cat tump.py)
lib32
boot
var
app
bin
lost+found
usr
snap
vmlinuz
initrd.img
root
srv
proc
home
lib
lib64
sys
initrd.img.old
mnt
tmp
media
libx32
run
opt
.bash_history
sbin
vmlinuz.old
dev
etc

有人可以重现这个吗?我觉得我疯了。

最佳答案

您的路径上有一个名为 inspect.py 的不同文件,这就是正在导入的文件。添加

import inspect
print(inspect.__file__)

到程序的开头以帮助找到它。就其本身而言,这是许多问题的重复。你的有趣之处在于重定向正在改变路径。如果我们在创建本地 inspect.py 后将 print(sys.path[:3]) 添加到 fs.sshfs 的导入中,我会得到:

(36) dsm@winter:~/coding$ python <(cat tump.py)
/home/dsm/sys/miniconda3/envs/36/lib/python3.6/inspect.py
['/dev/fd', '/home/dsm/sys/miniconda3/envs/36/lib/python36.zip', '/home/dsm/sys/miniconda3/envs/36/lib/python3.6']
(36) dsm@winter:~/coding$ python tump.py 
/home/dsm/coding/inspect.py
['/home/dsm/coding', '/home/dsm/sys/miniconda3/envs/36/lib/python36.zip', '/home/dsm/sys/miniconda3/envs/36/lib/python3.6']
Traceback (most recent call last):
  File "tump.py", line 6, in <module>
    from fs.sshfs import SSHFS
[...]
AttributeError: module 'inspect' has no attribute 'getmro'

文件描述符版本起作用的原因是因为有效的“本地”路径现在是 /dev/fd 而不是 /home/dsm/coding,并且 /dev/fd 不包含inspect.py 冲突。会有细微的差别(我使用的是 3.6 等),但这可能是相同的原因。

关于python - 从 cat 重定向会导致不同的 python 解释器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50241728/

相关文章:

python - 在 NumPy 中连接 View

python - 如何在 TF2 的 Keras Lambda 层中包装卡住的 Tensorflow 图?

python-3.x - 如何修复此错误 "Encoders require their input to be uniformly strings or numbers. Got [' float', 'str' ]"

python - 字典唯一组合Python列表

python - 将 h264 字节字符串转换为 OpenCV 图像

python - 在 python 中制作 JSON 对象

python - 无法将字符串转换为 float

python - 如何使用 Paramiko 指定端口号

python - Paramiko 在执行大型 wget 命令时挂起

python - 与 Cisco 路由器的持久 ssh session