2018年10月29日 星期一

Python 學習筆記 : pexpect 模組測試

上周為了評估上級新交辦任務, 花了些時間研究 Python 網路通訊功能中關於 telnet 與 ssh 協定的相關模組, 在下面這篇文章看到關於 pexpect 模組的介紹, 覺得它功能很多, 且很容易實現 telnet 與 ssh 協定通訊 :

[ Python 文章收集 ] python Pexpect

我在下面這本書看到 Python 模組 pexpect 的介紹 :

# Mastering Python Networking 2nd Edition (Packt)

此模組常用函數如下 :

我在 Win10 上的 Python 3.6.1 版安裝 pexpect 過程如下 :

Python 3.6.1 (C:\Python36\python.exe)
C:\Users\user>pip3 install pexpect 
Collecting pexpect
  Downloading https://files.pythonhosted.org/packages/89/e6/b5a1de8b0cc4e07ca1b305a4fcc3f9806025c1b651ea302646341222f88b/pexpect-4.6.0-py2.py3-none-any.whl (57kB)
Collecting ptyprocess>=0.5 (from pexpect)
  Downloading https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Installing collected packages: ptyprocess, pexpect 
Successfully installed pexpect-4.6.0 ptyprocess-0.6.0 

可見 pexpect 相依於 ptyprocess 模組, 離線安裝必須同時下載 ptyprogress 與 pexpect 的 whl 安裝檔, 而且要先安裝 ptyprogress 再安裝 pexpect. 但安裝完後呼叫 pexpect.spawn() 欲建立 telnet 連線卻出現錯誤訊息 :

>>> import pexpect 
>>> child=pexpect.spawn("telnet 127.0.0.1") 
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
AttributeError: module 'pexpect' has no attribute 'spawn'

用 Python 內建函數 dir() 檢視 pexpect 模組之內容, 發現裡面並無 spawn() 方法 :

>>> dir(pexpect) 
['EOF', 'ExceptionPexpect', 'Expecter', 'PY3', 'TIMEOUT', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__revision__', '__spec__', '__version__', 'exceptions', 'expect', 'is_executable_file', 'searcher_re', 'searcher_string', 'split_command_line', 'sys', 'utils', 'which']

搜尋上面之錯誤訊息才知 pexpect 目前僅支援 Linux/Unix 系列作業系統, 還沒有完全支援 Windows, 參考 :

Cannot import name 'spawn' for pexpect while using pxssh
pxssh import issue #339

我在樹莓派安裝 pexpect 後用 dir() 檢視發現在 Linux 上確實可用 :

pi@raspberrypi:~ $ sudo pip3 install pexpect   (務必要用 sudo)
Collecting pexpect
  Downloading https://files.pythonhosted.org/packages/89/e6/b5a1de8b0cc4e07ca1b305a4fcc3f9806025c1b651ea302646341222f88b/pexpect-4.6.0-py2.py3-none-any.whl (57kB)
Collecting ptyprocess>=0.5 (from pexpect)
  Downloading https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Installing collected packages: ptyprocess, pexpect
Successfully installed pexpect-4.6.0 ptyprocess-0.6.0
pi@raspberrypi:~ $ python3 
Python 3.4.2 (default, Oct 19 2014, 13:31:11)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pexpect 
>>> dir(pexpect) 
['EOF', 'ExceptionPexpect', 'Expecter', 'PY3', 'TIMEOUT', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__revision__', '__spec__', '__version__', 'exceptions', 'expect', 'is_executable_file', 'pty_spawn', 'run', 'runu', 'searcher_re', 'searcher_string', 'spawn', 'spawnbase', 'spawnu', 'split_command_line', 'sys', 'utils', 'which']

在 Portable Python v3.7 上線上安裝 pexpect :

D:\PortablePython37>python -m pip install pexpect 
Collecting pexpect
  Downloading https://files.pythonhosted.org/packages/89/e6/b5a1de8b0cc4e07ca1b305a4fcc3f9806025c1b651ea302646341222f88b/pexpect-4.6.0-py2.py3-none-any.whl (57kB)
Collecting ptyprocess>=0.5 (from pexpect)
  Downloading https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Installing collected packages: ptyprocess, pexpect
Successfully installed pexpect-4.6.0 ptyprocess-0.6.0

但後來在 Portable Python 3.7.0 上離線安裝 pexpect (有相依模組 ptyprocess) :

Microsoft Windows [版本 6.3.9600]
 (c) 2013 Microsoft Corporation. All rights reserved.

 C:\Python37>python -m pip install ptyprocess-0.6.0-py2.py3-none-any.whl 
 Processing c:\python37\ptyprocess-0.6.0-py2.py3-none-any.whl
 Installing collected packages: ptyprocess
 Successfully installed ptyprocess-0.6.0
 C:\Python37>python -m pip install pexpect-4.6.0-py2.py3-none-any.whl 
 Processing c:\python37\pexpect-4.6.0-py2.py3-none-any.whl
 Requirement already satisfied: ptyprocess>=0.5 in c:\python37\app\python\lib\sit
 e-packages (from pexpect==4.6.0) (0.6.0)
 Installing collected packages: pexpect
 Successfully installed pexpect-4.6.0

卻發現它有與樹莓派上一樣完整的功能 :

>>> import pexpect 
>>> dir(pexpect) 
['EOF', 'ExceptionPexpect', 'Expecter', 'PY3', 'TIMEOUT', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__revision__', '__spec__', '__version__', 'exceptions', 'expect', 'is_executable_file', 'pty_spawn', 'run', 'runu', 'searcher_re', 'searcher_string', 'spawn', 'spawnbase', 'spawnu', 'split_command_line', 'sys', 'utils', 'which']

所以 Pythoin 3.7 似乎可用 pexpect 了.

參考 :

Python安装使用命令行交互模块pexpect的基础教程

沒有留言 :