ファブリック1は手動入力を正しく処理しますが、ファブリック2は、ptyの有無にかかわらず、奇妙な動作をします。
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>
Windows 7 64b、cmd、Python 3.7 64b、Fabricバージョンでテスト済み:
Fabric3 1.14.post1、Fabric 2.3.1、Paramiko 2.4.1、Invoke 1.1.1
レポートをありがとう。 私は自分でWindowsシステムの診断を行うことはできませんが、他の誰かが再現できることを願っています。 過去にWindowsに関連する端末とエンコーディングに関連する問題を確実に潰したことがあるので、そこではかなり安定しているはずですが、別の問題を見つけたかもしれません。
別のチケットによって引き起こされた別の質問-これは常に起こったのですか、それとも最近始まったばかりですか? 別のユーザーが、最近のWindows Updateの後で、いくつかの奇妙な動作を報告しました(ただし、この報告された症状とは異なります)。
最近始まったかどうかは、以前にテストしたことがないのでわかりません。
今、私はPython3.5.3のWindows10でそれを試しましたが、変更はありません。
私はそれを数回試しましたが、一度このエラーが発生しました:
>>> 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
こんにちは、
それに対する修正。 上記と同じ問題があります。
2019-08-07 11:31:30,590-vm-1.0-GA-x86_64-minimal-template-1.0-Update-917-1565202528-INFO-exec [cd / root || $を終了しますか?; mkdir -m 777 -p / mnt / shared-1565202528]
テストリスト:{'tests':[{'test_catagory': 'upgrade'、 'test_json': 'runlists / upgrade.json'、 'priority': 'P0'}]}
トレースバック(最後の最後の呼び出し):
ファイル "harness.py"、行395、
メイン()
ファイル "harness.py"、行392、メイン
sys.exit(harness.start_run())
start_runのファイル "harness.py"、59行目
result_map = self.run()
ファイル「harness.py」、84行目、実行中
result_map [test ['test_catagory']] = self.run_tests(test)
run_testsのファイル「harness.py」、127行目
self.mount_storage_on_vm(vm_object)
mount_storage_on_vmのファイル "harness.py"、行241
"mkdir -m 777 -p%s"%(self.log_location))。return_code == 0:
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/guest.py"、行36、 run_with_cdで
return conn.run( "cd {} || exit $?; {}"。format(quote(dir)、command)、 * args)ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/photontools/runner/vm.py"、行242、 _pre_runでreturn _orig_run(command、* kwargs)
ファイル "
ファイル「/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py」、30行目
戻りメソッド(self、 args、* kwargs)
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/fabric/connection.py"、行702、実行中
self._run(self._remote_runner()、command、 * kwargs)を返しますファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/context.py"、行101、_runrunner.run(command、* kwargs)を返します
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py"、行291、実行中
self._run_body(command、** kwargs)を返します
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py"、行399、_run_body
ThreadException(thread_exceptions)を発生させます
invoke.exceptions.ThreadException:
スレッド内で1つの例外を見た(NotImplementedError):
スレッド引数:{'kwargs':{'echo':なし、
'input _':<_ io.textiowrapper i = "44">、
'出力':<_ io.textiowrapper i = "46">}、
'目標':
トレースバック(最後の最後の呼び出し):
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/util.py"、行233、実行中
super(ExceptionHandlingThread、self).run()
ファイル "/usr/lib/python3.6/threading.py"、行864、実行中
self._target( self._args、* self._kwargs)
ファイル "/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py"、706行目、handle_stdin
self.close_proc_stdin()
ファイル「/root/workspace/upgrade-test-CI-in-harness/update-basic-in-harness/.venv/lib/python3.6/site-packages/invoke/runners.py」、939行目、close_proc_stdin
NotImplementedErrorを発生させます
NotImplementedError
同じ問題が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
stdoutからホスト名を取得できました。 しかし、私はまだ以下のような例外を受け取りました。
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
以下のようなrequirements.txtの私のコンテンツ:
requests==2.11.1
fabric==2.4.0
xmltodict
2019/08/07以降、 pip install -r requirements.txt
実行した後、異なるバージョンのパッケージをインストールすることがわかりました。
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
invokeパッケージのバージョンが異なります。
これは、invokeの1.2から1.3バージョンへの重大な変更です。
https://github.com/pyinvoke/invoke/issues/654
@baconYaoを見つけて
ここでも同じですが、スレッド化されたタスクを継続的に実行しているときにキーを押すと、ソケットエラーが発生します。
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
2.4.0でも同じ問題が発生しました。 私はセロリの仕事の中でファブを使っていました。 何らかの理由で2.5.0にアップグレードすると問題が解決しました。
この問題は、WindowsまたはWSL環境にも関連している可能性があります。 最新のWindows10で最新のUbuntuWSLを使用して同じスタックトレースを作成し、macOSでタスクを実行することで解決しました。
上記のようにファブリックをアップグレードまたはダウングレードしたり、呼び出したりしても、機能しませんでした。
奇妙なことに、ほとんどのタスクはWSLでも機能し、非常に長いタスク(多くのrun()コマンド)のみがこの例外で非決定的に失敗しました。つまり、不確実な数のコマンドが実行された後です。
私はこれを見つけることができてとてもうれしいです。
さらに調査すると、Responderクラスに接続することもできます。 レスポンダーを使用して、いくつかのすばやく連続した.run()コマンドで「はい」と答えましたが、これはWSLでは失敗します。 代わりに、レスポンダーオブジェクトを削除して「yes | the-command」を呼び出すと、WSLでも機能しました。
最も参考になるコメント
これは、invokeの1.2から1.3バージョンへの重大な変更です。
https://github.com/pyinvoke/invoke/issues/654