Перенаправление с cat приводит к другому поведению интерпретатора Python - PullRequest
0 голосов
/ 08 мая 2018

Я не уверен, как лучше обратиться или запросить для этой проблемы. У меня есть простая программа, которая использует модуль fs.sshfs, который зависит от paramiko и, следовательно, cryptogaphy.utils. Из моей virtualenv с python версией 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 непосредственно для файла, я получаю AttributeError против getargspec.

(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

Может кто-нибудь воспроизвести это? Я думаю, что схожу с ума.

1 Ответ

0 голосов
/ 08 мая 2018

У вас есть другой файл с именем inspect.py на вашем пути, и это тот, который импортируется. Добавить

import inspect
print(inspect.__file__)

к началу вашей программы, чтобы помочь найти это. Само по себе это дубликат множества вопросов. Что вас интересует, так это то, что редирект меняет путь. Если мы добавим print(sys.path[:3]) к импорту fs.sshfs после создания локальной inspect.py, я получу:

(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 и т. Д.), Но, вероятно, это та же причина.

...