Linux7.3系统 升级python到3.6使用ping主机脚本

Linux7.3默认的python系统是2.7.5,然后想着升级使用python3.6.6

1 下载

2 解压  tar fx Python-3.6.6.tgz

3  configure --prefix=/usr/local/python3.6

4 make && make install

5 ln -s /usr/local/python3.6/bin/python3.6  /usr/bin/python3.6

说明:这里是让两个版本的python共存

下面的脚本成功执行的

# /usr/bin/env python3.6
# -*- coding: utf-8 -*-

import time
import subprocess
import re
from concurrent.futures import ThreadPoolExecutor


def ping_call(ip):
    command = 'ping -c 2 -W 1 %s' % ip
    print(command)
    file = open('/dev/null', 'w')
    result = subprocess.call(command,
                             shell=True, stdout=file, stderr=file)
    print(result)
    if result:
        print('ip-address {} ping fail'.format(ip))
    else:
        print('ip-address {} ping ok'.format(ip))
        success.append(ip.split('.')[-1])
    file.close()


if __name__ == '__main__':
    network = input('please input network>>>').strip()
    host = input('please input your host range>>>').strip().split()
    a, b = host[0], host[1]
    print(network.split('.'))
    if len(network.split('.')) == 3 and a.isdigit() and b.isdigit() and re.match('d{1,3}.d{1,3}.d{1,3}', network):
        a, b = int(a), int(b)
        pool = ThreadPoolExecutor(50)
        start_time = time.time()
        success = []
        for i in range(a, b + 1):
            ret = pool.submit(ping_call, network + "." + str(i))
        pool.shutdown()
        print("multi_Thread spend-time {:.2f}".format(time.time() - start_time))
        print("passed host is: ")
        print(success)

说明:但是始终有个问题:不能使用中文,使用中文就报错,百度多次,暂时不明原因

使用中文报错:

UnicodeEncodeError 'ascii' codec can't encode characters in position

找到问题根源了:输入和输出编码的问题

[root@centos7 ~]# python3.6
Python 3.6.6 (default, Sep  1 2018, 17:07:25) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding   
'ANSI_X3.4-1968'
>>> sys.stdin.encoding         
'ANSI_X3.4-1968'
>>> 

所以使用前加入PYTHONIOENCODING=utf-8

中文版:

# /usr/bin/env python3.6
# -*- coding: utf-8 -*-

import time
import subprocess
import re
from concurrent.futures import ThreadPoolExecutor


def ping_call(ip):
    command = 'ping -c 2 -W 1 %s' % ip
    print(command)
    file = open('/dev/null', 'w')
    result = subprocess.call(command,
                             shell=True, stdout=file, stderr=file)
    print(result)
    if result:
        print('ip地址: {} ping fail'.format(ip))
    else:
        print('ip地址: {} ping ok'.format(ip))
        success.append(ip.split('.')[-1])
    file.close()


if __name__ == '__main__':
    network = input('请输入 网段>>>').strip()
    host = input('请输入主机范围,空格隔开>>>').strip().split()
    a, b = host[0], host[1]
    print(network.split('.'))
    if len(network.split('.')) == 3 and a.isdigit() and b.isdigit() and re.match('d{1,3}.d{1,3}.d{1,3}', network):
        a, b = int(a), int(b)
        pool = ThreadPoolExecutor(50)
        start_time = time.time()
        success = []
        for i in range(a, b + 1):
            ret = pool.submit(ping_call, network + "." + str(i))
        pool.shutdown()
        print("multi_Thread spend-time {:.2f}".format(time.time() - start_time))
        print("passed host is: ")
        print(success)
View Code

执行:与python2的方式不一样

[root@centos7 ~]# PYTHONIOENCODING=utf-8 python3.6 ping_host3.6.py 
请输入 网段>>>192.168.0
请输入主机范围,空格隔开>>>1 10
['192', '168', '0']
ping -c 2 -W 1 192.168.0.1
ping -c 2 -W 1 192.168.0.2
0
ip地址: 192.168.0.1 ping ok
ping -c 2 -W 1 192.168.0.3
ping -c 2 -W 1 192.168.0.4
ping -c 2 -W 1 192.168.0.5
ping -c 2 -W 1 192.168.0.6
ping -c 2 -W 1 192.168.0.7
ping -c 2 -W 1 192.168.0.8
ping -c 2 -W 1 192.168.0.9
ping -c 2 -W 1 192.168.0.10
0
ip地址: 192.168.0.2 ping ok
1
ip地址: 192.168.0.3 ping fail
1
ip地址: 192.168.0.4 ping fail
1
ip地址: 192.168.0.5 ping fail
1
ip地址: 192.168.0.6 ping fail
1
ip地址: 192.168.0.7 ping fail
1
ip地址: 192.168.0.8 ping fail
1
ip地址: 192.168.0.9 ping fail
1
ip地址: 192.168.0.10 ping fail
multi_Thread spend-time 2.09
passed host is: 
['1', '2']
View Code

 最后去掉提示改为一行命令版

# /usr/bin/env python3.6
# -*- coding: utf-8 -*-

import time
import subprocess
import re
import sys
import os
from concurrent.futures import ThreadPoolExecutor


def ping_call(ip):
    command = 'ping -c 2 -W 1 %s' % ip
    print(command)
    file = open('/dev/null', 'w')
    result = subprocess.call(command,
                             shell=True, stdout=file, stderr=file)
    if result:
        print('ip地址: {} ping fail'.format(ip))
    else:
        print('ip地址: {} ping ok'.format(ip))
        success.append(ip.split('.')[-1])
    file.close()


if __name__ == '__main__':
    # network = input('请输入 网段>>>').strip()
    network = sys.argv[1]
    # host = input('请输入主机范围,空格隔开>>>').strip().split()
    a, b = sys.argv[2], sys.argv[3]
    print(network.split('.'))
    if len(network.split('.')) == 3 and a.isdigit() and b.isdigit() and re.match('d{1,3}.d{1,3}.d{1,3}', network):
        a, b = int(a), int(b)
        pool = ThreadPoolExecutor(50)
        start_time = time.time()
        success = []
        for i in range(a, b + 1):
            ret = pool.submit(ping_call, network + "." + str(i))
        pool.shutdown()
        print("花费的时间: {:.2f}".format(time.time() - start_time))
        print("能ping通的主机有: ")
        for i in success:
            print(i, end='	')
        print()
原文地址:https://www.cnblogs.com/mmyy-blog/p/9573353.html