Fabric 1 menangani input manual dengan benar, tetapi Fabric 2 berperilaku aneh, dengan pty atau tanpa.
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
# contents of test_input.sh
# #!/bin/bash
# read -p "enter value: " var
# echo "you entered $var"
# Fabric 1 handled input correctly
>>> run("~/test_input.sh")
[riskapp.comm.equabank.loc] run: ~/test_input.sh
[riskapp.comm.equabank.loc] Login password for 'user':
[riskapp.comm.equabank.loc] out: enter value: foo # typed "foo" ENTER
[riskapp.comm.equabank.loc] out: you entered foo
[riskapp.comm.equabank.loc] out:
'enter value: foo\r\nyou entered foo'
# Fabric 2 without pty doesn't show prompt and behaves strange, must hit enter twice to finish command
>>> c = Connection(SERVER, connect_kwargs={"password": PASSWORD})
>>> c.run("~/test_input.sh")
bar # typed "bar" ENTER
bar # only "b" appeared, the rest after another ENTER
you entered bar
<Result cmd='~/test_input.sh' exited=0>
# Fabric 2 with pty shows prompt but input behavior is still strange, still must hit enter twice
>>> c.run("~/test_input.sh", pty=True)
enter value: baz # typed "baz" ENTER
b # another ENTER
az
you entered baz
<Result cmd='~/test_input.sh' exited=0>
# Fabric 2 automatic response works ok with pty
>>> c.run("~/test_input.sh", pty=True, watchers=[Responder(pattern="enter value", response="foo\n")])
enter value: foo
you entered foo
<Result cmd='~/test_input.sh' exited=0>
Diuji pada Windows 7 64b dalam cmd, Python 3.7 64b, dengan versi Fabric:
Fabric3 1.14.post1, Fabric 2.3.1, Paramiko 2.4.1, Invoke 1.1.1
Terima kasih atas laporannya. Saya tidak dapat melakukan diagnosis pada sistem Windows sendiri, tetapi mudah-mudahan orang lain dapat mereproduksi. Saya dapat mengatakan bahwa kami telah menghancurkan sejumlah masalah terkait terminal & pengkodean yang terkait dengan Windows di masa lalu sehingga hal-hal _harus_ cukup stabil di sana, tetapi Anda mungkin telah menemukan yang lain.
Pertanyaan lain yang dipicu oleh tiket lain - apakah ini selalu terjadi atau baru dimulai baru-baru ini? Pengguna lain melaporkan beberapa perilaku aneh (tetapi berbeda dari gejala yang dilaporkan ini) setelah pembaruan Windows baru-baru ini.
Saya tidak bisa mengatakan, apakah itu dimulai baru-baru ini atau tidak, karena saya belum mengujinya sebelumnya.
Sekarang saya mencobanya di Windows 10 dengan Python 3.5.3 dan tidak ada perubahan.
Saya mencobanya beberapa kali dan setelah itu berakhir dengan kesalahan ini:
>>> c.run("~/test_input.sh")
asv # i typed "asv" ENTER
asv # another ENTER
you entered asv
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<decorator-gen-3>", line 2, in run
File "C:\Python35\lib\site-packages\fabric2\connection.py", line 30, in opens
return method(self, *args, **kwargs)
File "C:\Python35\lib\site-packages\fabric2\connection.py", line 702, in run
return self._run(self._remote_runner(), command, **kwargs)
File "C:\Python35\lib\site-packages\invoke\context.py", line 101, in _run
return runner.run(command, **kwargs)
File "C:\Python35\lib\site-packages\invoke\runners.py", line 271, in run
return self._run_body(command, **kwargs)
File "C:\Python35\lib\site-packages\invoke\runners.py", line 365, in _run_body
raise ThreadException(thread_exceptions)
invoke.exceptions.ThreadException:
Saw 1 exceptions within threads (OSError):
Thread args: {'kwargs': {'echo': None,
'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='cp852'>,
'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp852'>},
'target': <bound method Runner.handle_stdin of <fabric2.runners.Remote object at 0x000001BF0189C908>>}
Traceback (most recent call last):
File "C:\Python35\lib\site-packages\invoke\util.py", line 233, in run
super(ExceptionHandlingThread, self).run()
File "C:\Python35\lib\threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "C:\Python35\lib\site-packages\invoke\runners.py", line 648, in handle_stdin
self.write_proc_stdin(data)
File "C:\Python35\lib\site-packages\invoke\runners.py", line 784, in write_proc_stdin
self._write_proc_stdin(data.encode(self.encoding))
File "C:\Python35\lib\site-packages\fabric2\runners.py", line 69, in _write_proc_stdin
return self.channel.sendall(data)
File "C:\Python35\lib\site-packages\paramiko\channel.py", line 846, in sendall
sent = self.send(s)
File "C:\Python35\lib\site-packages\paramiko\channel.py", line 801, in send
return self._send(s, m)
File "C:\Python35\lib\site-packages\paramiko\channel.py", line 1180, in _send
raise socket.error("Socket is closed")
OSError: Socket is closed
Hai,
Perbaikan apa pun tentang itu. Kami memiliki masalah yang sama seperti yang ditunjukkan di atas.
07-08-2019 11: 31: 30.590 - vm-1.0-GA-x86_64-minimal-template-1.0-Update-917-1565202528 - INFO - exec [cd / root || keluar $ ?; mkdir -m 777 -p / mnt / shared-1565202528]
daftar pengujian: {'tests': [{'test_catagory': 'upgrade', 'test_json': 'runlists / upgrade.json', 'priority': 'P0'}]}
Traceback (panggilan terakhir terakhir):
File "harness.py", baris 395, in
utama()
File "harness.py", baris 392, di main
sys.exit (harness.start_run ())
File "harness.py", baris 59, di start_run
result_map = self.run ()
File "harness.py", baris 84, sedang dijalankan
result_map [test ['test_catagory']] = self.run_tests (test)
File "harness.py", baris 127, di run_tests
self.mount_storage_on_vm (vm_object)
File "harness.py", baris 241, di mount_storage_on_vm
"mkdir -m 777 -p% s"% (self.log_location)). return_code == 0:
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/guest.py", baris 36, di run_with_cd
return conn.run ("cd {} || exit $ ?; {}". format (quote (dir), command), * args)File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/vm.py", baris 242, dalam _pre_runreturn _orig_run (perintah, * kwargs)
File "
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", baris 30, terbuka
metode pengembalian (self, args, * kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py", baris 702, sedang dijalankan
return self._run (self._remote_runner (), perintah, * kwargs)File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/context.py", baris 101, dalam _runreturn runner.run (perintah, * kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 291, sedang dijalankan
return self._run_body (perintah, ** kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 399, dalam _run_body
naikkan ThreadException (thread_exceptions)
invoke.exceptions.ThreadException:
Melihat 1 pengecualian dalam utas (NotImplementedError):
Argumen utas: {'kwargs': {'echo': Tidak ada,
'input_': <_io.textiowrapper i = "44">,
'output': <_io.textiowrapper i = "46">},
'target':
Traceback (panggilan terakhir terakhir):
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py", baris 233, sedang dijalankan
super (ExceptionHandlingThread, self) .run ()
File "/usr/lib/python3.6/threading.py", baris 864, sedang dijalankan
self._target ( self._args, * self._kwargs)
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 706, di handle_stdin
self.close_proc_stdin ()
File "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py", baris 939, di close_proc_stdin
meningkatkan NotImplementedError
NotImplementedError
Masalah yang sama terjadi pada 2019/08/07
def ssh_login_target_nas():
""" Use ssh to login the target NAS
return
type: <class 'fabric.connection.Connection'>
"""
# Set up fabric's login information
host = SSH_ACCOUNT + "@" + SELF_NAS_IP_ADDRESS
# Connect to your nas
c = Connection(host = host, connect_kwargs={"password": SSH_ACCOUNT_PASSWORD})
try:
hostname = c.run('hostname').stdout.strip()
logger.debug("Connect to NAS: " + hostname)
except Exception, error:
logger.error(error)
raise SystemExit
return c
Saya bisa mendapatkan nama host dari stdout. Tapi saya masih mendapat pengecualian seperti di bawah ini.
05:57:13 [ERROR] - 2019-08-08 05:58:17,108 - auto_update: ssh_login_target_nas 54 -
05:57:13 Saw 1 exceptions within threads (NotImplementedError):
05:57:13
05:57:13
05:57:13 Thread args: {'kwargs': {'echo': None,
05:57:13 'input_': <open file '<stdin>', mode 'r' at 0x7fbf8f39b0c0>,
05:57:13 'output': <open file '<stdout>', mode 'w' at 0x7fbf8f39b150>},
05:57:13 'target': <bound method Remote.handle_stdin of <fabric.runners.Remote object at 0x7fbf8c6d3e10>>}
05:57:13
05:57:13 Traceback (most recent call last):
05:57:13
05:57:13 File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/util.py", line 233, in run
05:57:13 super(ExceptionHandlingThread, self).run()
05:57:13
05:57:13 File "/usr/lib/python2.7/threading.py", line 754, in run
05:57:13 self.__target(*self.__args, **self.__kwargs)
05:57:13
05:57:13 File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 706, in handle_stdin
05:57:13 self.close_proc_stdin()
05:57:13
05:57:13 File "/home/vagrant/workspace/qsirch-v4.1-ui-autotester-chrome/qpkg-update/uenv/local/lib/python2.7/site-packages/invoke/runners.py", line 939, in close_proc_stdin
05:57:13 raise NotImplementedError
05:57:13
05:57:13 NotImplementedError
Konten saya dari requirement.txt seperti di bawah ini:
requests==2.11.1
fabric==2.4.0
xmltodict
Saya menemukan bahwa saya akan menginstal versi paket yang berbeda setelah menjalankan pip install -r requirements.txt
sejak 2019/08/07.
2019/08/06.
Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.2.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0
2019/08/07.
Successfully installed asn1crypto-0.24.0 bcrypt-3.1.7 cffi-1.12.3 cryptography-2.7 enum34-1.1.6 fabric-2.4.0 invoke-1.3.0 ipaddress-1.0.22 paramiko-2.6.0 pycparser-2.19 pynacl-1.3.0 requests-2.11.1 six-1.12.0 xmltodict-0.12.0
Versi paket pemanggilan berbeda.
Berikut adalah perubahan pemanggilan dari 1.2 ke 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654
great menemukan @baconYao , ini juga memblokir saya. menurunkan permintaan untuk saat ini ke 1.2 telah membuat saya melewati masalah ini. Sangat dihargai.
Sama di sini, pada setiap penekanan tombol dalam tugas berulir yang terus berjalan, saya mendapatkan kesalahan soket.
Saw 1 exceptions within threads (OSError):
Thread args: {'kwargs': {'echo': None,
'input_': <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>,
'output': <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>},
'target': <bound method Runner.handle_stdin of <fabric.runners.Remote object at 0x7fcad97aeed0>>}
Traceback (most recent call last):
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/util.py", line 233, in run
super(ExceptionHandlingThread, self).run()
File "/usr/lib64/python3.7/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 694, in handle_stdin
self.write_proc_stdin(data)
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/invoke/runners.py", line 832, in write_proc_stdin
self._write_proc_stdin(data.encode(self.encoding))
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/fabric/runners.py", line 67, in _write_proc_stdin
return self.channel.sendall(data)
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 846, in sendall
sent = self.send(s)
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 801, in send
return self._send(s, m)
File "/home/ds/.local/share/virtualenvs/port_error_histogram-BRcAd8l-/lib/python3.7/site-packages/paramiko/channel.py", line 1198, in _send
raise socket.error("Socket is closed")
OSError: Socket is closed
Saya memiliki masalah yang sama dengan 2.4.0. Saya menggunakan fab di dalam seledri. Untuk beberapa alasan, memutakhirkan ke 2.5.0 menyelesaikannya.
Masalah ini juga dapat dihubungkan ke lingkungan Windows atau WSL. Kami memiliki stacktrace yang sama menggunakan Ubuntu WSL terbaru di Windows 10 terbaru, dan menyelesaikannya dengan menjalankan tugas kami di macOS.
Upgrade atau downgrade kain dan atau permintaan seperti yang disebutkan di atas tidak berhasil untuk kami.
Hal yang aneh adalah, bahwa sebagian besar tugas juga bekerja pada WSL, hanya tugas yang sangat panjang (banyak perintah run ()) yang gagal dengan pengecualian ini secara non-deterministik, yaitu, setelah sejumlah perintah yang tidak pasti dijalankan.
Saya sangat senang bisa menemukan ini.
Pada penyelidikan lebih lanjut, itu juga bisa dihubungkan ke kelas Responder. Kami menggunakan responder untuk menjawab "ya" pada beberapa perintah .run () yang berurutan secara cepat, dan ini akan gagal di WSL. Menghapus objek Responder dan memanggil "yes | the-command" juga berfungsi di WSL.
Komentar yang paling membantu
Berikut adalah perubahan pemanggilan dari 1.2 ke 1.3 verion.
https://github.com/pyinvoke/invoke/issues/654