Jupyter 中 IPython 可以用的12个方便命令

我在日常编程中一般都会用到两个工具——Pycharm和Jupyter,在刷算法、写爬虫时会用到前者,因为我习惯用Pycharm里的Debug功能调试,很容易找出代码中的Bug。而进行数据分析、机器学习时就会用到后者,因为Jupyter编译器利用的IPython是一种交互式计算和开发环境,而且有许多方便命令。
Jupyter对数据的可视化十分友好,这类单元格的形式每一步都有运行结果,便于整理自己思路,并且很大程度上节约了运行时间,在调试的时候只需要运行出错的部分代码,而不是全部。

IPython中有一些特有的魔法命令,如果能合理的利用这些魔法命令,会省去很多不必要的操作,为编程带来很大程度的便利,下面就来安利十二个常用的魔法命令。

方便命令的基础常识

  • ?和?? ->例:%matplotlib?、%matplotlib??

后缀为?可以获取一个对象的相关信息,比如描述一个方法该怎么用;后缀为??可以获取该对象更加详细的信息,比如源码。这个对象可以是IPython中自带的、也可以是导入的、也可以是自己定义的。

  • %和%% ->例:%time、%%time

前缀为%被称作行魔法命令(line magics),只能在单个输入行上运行;前缀为%%被称作单元格魔法命令(cell magics),可以在多个输入行上运行。

1.%Ismagic和%magic

如果你还不了解IPython的魔法命令,那这两个魔法命令一定是最重要的,记牢这两个命令之后慢慢了解剩下的。%lsmagic的作用就是列出所有存在的行魔法命令和单元格魔法命令,部分截图如下:

Jupyter 中 IPython 可以用的12个方便命令

%magic的作用就是给出所有魔法命令的详细介绍,比如介绍、样例等等,比较考验英语功底,耐下心慢慢了解。

2.%pdb

输入这个命令并且运行之后,如果后面的代码出现了异常,这个指令就会主动进入调试器,几十行几百行代码难免会有几个或一堆Bug。可能比较笨的方法就是找断点然后print,最后还要把print删掉,而%pdb调试找到Bug后直接退出就好,相对前者更方便些。

图片

比如两个数相加,不小心把一个整数定义成字符型,在调用函数计算时会发生报错,然后就可以进入调试器进行调试,切记最后要通过exit()退出,不能直接终止单元格运行。

3.%debug

%debug的作用与%pdb几乎是一样的,不同之处就是%pdb在遇到异常自动进入调试器,而%debug是人遇到报错主动输入指令进入调试器,仍然是上面那个例子,调试界面如下:
图片
主动和被动两种调试方式大家可以靠自己喜好选择,我个人比较喜欢%debug。

4.%who和%whos

代码一多变量可能就会变多,变量一多可能就会混淆,或者在删除单元格的时候不小心把变量定义的单元格也删掉了,%who和%whos这两条命令就起到大作用了。
图片
%who给出的信息只有全局变量的名称,而%whos给出的信息更加详细,包括变量名称、类型、和数据。

5.%time和%timeit

这两条命令都是用来输出代码的执行时间,比如可以用来粗略的比较两种算法在相同的问题上执行时间哪一个更少,不同点在于%time只执行一次就输出执行时间,而%timeit是执行多次然后计算平均时间再输出。
图片
比如这里%timeit命令输出中有7 runs代表共执行7次,这两个命令都为行命令,%%time和%%timeit为单元格命令,区别同上。

6.%store

如果你在一个文件中花了很长的时间清理了一些数据,比如对原始数据缺失值填充呀、降维呀、转换呀等等,然后在另一个文件中需要用到同样的数据,笨一点方法就是将数据保存然后在新文件中调用,但这种操作一条%store命令就能完成,我们先在一个文件中利用%store保存一个变量。
图片
然后在另一个文件中调用这个变量:
图片
可以看到直接调用是会报错的,但利用了%store -r命令之后就可以成功调用被%store保存的变量,所以%store用来保存,%store -r用来读取。

7.%xdel和%reset

这条命令的作用就是删除变量,并且删除其在IPython中的对象上的一切引用。平时在数据清洗时,从原始数据到清洗后的数据中间要经过很多步骤,我们不可能全程用一个变量名称,所以中间步骤很容易为数据起一些类似的名称,而利用%xdel就可以将无用的单个变量名称删掉,防止混淆。
图片
%reset的作用就是删除所有变量名。

8.%cls

在数据清洗时候,通常都是做一步然后输出一次数据集,观察一下变化,我们都知道展示数据集是很占网页的,久而久之,这个notebook就特别长,再想查看文件前面的内容不仅需要滚动很长时间滑轮,而且数据间很容易混淆,所以每当输出一次数据集后可以利用%cls命令清除一次,使notebook看起来更整洁。
图片
可以看到正常的话data之后会打印数据集,但利用%cls之后数据集的输出被清除了。

9.%%writefile

如果我们想写一个函数,例如去除中文符号的函数,这样的函数在很多情景下都可以利用,所以我们可以将这个函数写入一个单独文件,想用的时候直接调用,这个操作可以利用%%writefile命令进行写入。
图片

10.%run

%run命令的作用就是运行脚本文件,不仅可以直接使用脚本文件中的代码,脚本文件也可以使用IPython环境中的变量,仍用上面的例子,可以用%run命令直接运行。
图片

11.%psource

如果你在notebook定义了一个函数,但隔了比较久需要用到这个函数,但是可能忘记了这个函数需要传入哪些参数、或者传入参数的类型应该是什么,这种情况下就不得不往前翻寻找这个函数的代码,但利用%psource可以偷懒,这个命令就是输出源代码。
图片
前面提及的??也有相同的作用,但是输出的形式没有%psource直观,还混有其它的信息在里面。

12.%hist

%hist的作用就是打印所有命令行输入的历史记录,方便查看之前输入的代码信息。
图片
这个命令允许设置查询的区间,也就是命令行输入对应的序号。
图片
这些魔法命令有一部分能被常用的代码语句代替,但是却没有魔法命令简单明了,只是个人习惯的问题,如果可能尽量改掉自己的思维定式,用更加便捷的代码处理问题。
转自Python编程时光。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

对比Excel数据透视表,学习pandas pivot_table

Excel的数据透视表非常有用,但是Pandas也有这个功能你知道吗?今天我们来对比Excel数据透视表,学习pandas pivot_table

1.Excel中做数据透视表

① 选中整个数据源;

对比Excel数据透视表,学习pandas pivot_table

 

② 依次点击“插入”—“数据透视表”

 

③ 选择在Excel中的哪个位置,插入数据透视表

 

④ 然后根据实际需求,从不同维度展示结果

 

⑤ 结果如下

2. pandas 用 pivot_table 做数据透视表

1)语法格式
pd.pivot_table(data,index=None,columns=None,
               values=None,aggfunc='mean',
               margins=False,margins_name='All',
               dropna=True,fill_value=None)

2)对比excel,说明上述参数的具体含义

 

参数说明:

  • data 相当于Excel中的”选中数据源”;

  • index 相当于上述”数据透视表字段”中的行;

  • columns 相当于上述”数据透视表字段”中的列;

  • values 相当于上述”数据透视表字段”中的值;

  • aggfunc 相当于上述”结果”中的计算类型;

  • margins 相当于上述”结果”中的总计;

  • margins_name 相当于修改”总计”名,为其它名称;

     

下面几个参数,用的较少,记住干嘛的,等以后需要就百度。

  • dropna 表示是否删除缺失值,如果为True时,则把一整行全作为缺失值删除;

  • fill_value 表示将缺失值,用某个指定值填充。

3. 案例说明

1)求出不同品牌下,每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns="月份",
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

2)求出不同品牌下,每个地区、每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns=["销售区域","月份"],
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

3)求出不同品牌不同地区下,每个月份的销售数量之和

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index=["品牌","销售区域"],columns="月份",
                     values="销售数量",aggfunc=np.sum)
display(df1)

结果如下:

 

4)求出不同品牌下的“销售数量之和”与“货号计数”

 

① 在Excel中的操作结果如下

 

② 在pandas中的操作如下

df = pd.read_excel(r"C:\Users\黄伟\Desktop\pivot_table.xlsx")
display(df.sample(5))

df.insert(1,"月份",df["销售日期"].apply(lambda x:x.month))
display(df.sample(5))

df1 = pd.pivot_table(df,index="品牌",columns="月份",
                     values=["销售数量","货号"],
                     aggfunc={"销售数量":"sum","货号":"count"},
                     margins=True,margins_name="总计")
display(df1)

结果如下:

本文转自凹凸数据。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

点击下方阅读原文可获得更好的阅读体验

Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 调用 Shodan 实战教程 — 互联网上最可怕的搜索引擎

Shodan 在百度百科里被给出了这么一句话介绍:Shodan是互联网上最可怕的搜索引擎。

为什么呢?与谷歌、百度等搜索引擎爬取网页信息不同,Shodan爬取的是互联网上所有设备的IP地址及其端口号。

而随着智能家电的普及,家家户户都有许多电器连接到互联网,这些设备存在被入侵的可能性,这是十分危险的。

说了这么多,给大家体验下shodan,让你们有更切身的理解。打开shodan,在搜索框输入 Hikvision-Webs:

你会搜素到这个品牌的摄像头设备遍及全球的IP及其暴露的端口号:

可以看到,这台机器暴露了17、80、111、995、3128、5000、6000、20547端口,黑客可以根据这些端口进行针对性的攻击。

不过也不需要过于担心,如果你的服务不存在漏洞,一般是无法攻入的。但有些端口号会暴露摄像头的web管理端,如下:

那么黑客可能可以用暴力破解的方式,强行进入摄像头后台管理端,获取到实时的录像。

谨记这会侵犯别人的隐私权,是违法的行为,我们是遵纪守法的好公民所以知道它的原理和危害就足够。我们的目的是运用技术保护好个人隐私,如非必要不将摄像头接入互联网,一定要接入的话,不能使用容易被破解的弱口令。

Shodan Web端非常好用,但如果我们有从Python搜索的需求怎么办?

没关系,shodan 官方也提供了python官方SDK包,下面就来讲讲这个SDK包的使用。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install shodan

2.Shodan 注册账号获取API

使用 Shodan 必须注册账号,注册网址https://account.shodan.io/register

输入完相关信息,点击 CREATE 会跳转到个人账户页:

此时 API Key 会显示你的API秘钥,请记录这个秘钥,后续会使用到这个秘钥去请求接口。

3.Shodan 基本调用实战教程

Shodan本质上就是一个搜索引擎,你只需要输入搜索的关键词:

# 公众号:Python 实用宝典
# 2021-05-04
from shodan import Shodan

api = Shodan('你的API KEY')

def search_shodan(keyword):
    # 调用搜索接口
    result = api.search(keyword)

    # 显示所有IP
    for service in result['matches']:
            print(service['ip_str'])

search_shodan("Hikvision-Webs")

结果如下:

可惜的是,普通API只能像这样搜索关键字,无法使用过滤条件如:Hikvision-Webs country:”US” 搜索美国内的所有Hikvision网站管理端。

如果你想要使用过滤条件,Shodan需要你升级API权限:

挺贵的,不过还好是一次性支付,永久使用。

4. Shodan 高级使用教程

Shodan 的用处当然不仅仅是在黑客攻防中,它还能用于统计。如果你想要了解哪些国家的使用这款摄像头的数量最多,可以使用 Facets 特性。

# 公众号:Python 实用宝典
# 2021-05-04
from shodan import Shodan

api = Shodan('你的API KEY')
def try_facets(query):
    FACETS = [
        'org',
        'domain',
        'port',
        'asn',
        ('country', 3),
    ]

    FACET_TITLES = {
        'org': 'Top 5 Organizations',
        'domain': 'Top 5 Domains',
        'port': 'Top 5 Ports',
        'asn': 'Top 5 Autonomous Systems',
        'country': 'Top 3 Countries',
    }

    try:
        # 使用 count() 方法可以不需要升级API,且比 search 方法更快。
        result = api.count(query, facets=FACETS)

        print('Shodan Summary Information')
        print('Query: %s' % query)
        print('Total Results: %s\n' % result['total'])

        # 显示每个要素的摘要
        for facet in result['facets']:
            print(FACET_TITLES[facet])

            for term in result['facets'][facet]:
                print('%s: %s' % (term['value'], term['count']))

    except Exception as e:
        print('Error: %s' % e)

try_facets("Hikvision-Webs")

得到结果如下:

从 Top 3 Countries 中可以看到,这款摄像头使用数量排名前三的国家分别是:美国、日本和德国。

没想到吧,Shodan居然还能用于产品分析。同样地原理,如果你把关键词改为”apache”,你可以知道目前哪些国家使用apache服务器数量最多,最普遍被使用的版本号是什么。

简而言之,Shodan是一个非常强大的搜索引擎,它在好人手里,能被发挥出巨大的潜能。如果Shodan落入坏人之手的话,那真是一个可怕的东西。

为了避免受到不必要的攻击,请大家及时检查所有联网设备的管理端的密码,如果有使用默认密码及弱口令,立即进行密码的更改,以保证服务的安全。

本文所有源代码可在 Python 实用宝典 公众号后台回复:shodan 下载。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Python 新型的爬虫框架 feapder, 支持爬虫报警机制

图片

1. 前言

众所周知,Python 最流行的爬虫框架是 Scrapy,它主要用于爬取网站结构性数据

今天推荐一款更加简单、轻量级,且功能强大的爬虫框架:feapder

项目地址:

https://github.com/Boris-code/feapder

2. 介绍及安装

和 Scrapy 类似,feapder 支持轻量级爬虫、分布式爬虫、批次爬虫、爬虫报警机制等功能

内置的 3 种爬虫如下:

  • AirSpider

    轻量级爬虫,适合简单场景、数据量少的爬虫

  • Spider

    分布式爬虫,基于 Redis,适用于海量数据,并且支持断点续爬、自动数据入库等功能

  • BatchSpider

    分布式批次爬虫,主要用于需要周期性采集的爬虫

在实战之前,我们在虚拟环境下安装对应的依赖库

# 安装依赖库
pip3 install feapder

3. 实战一下

我们以最简单的 AirSpider 来爬取一些简单的数据

目标网站:aHR0cHM6Ly90b3BodWIudG9kYXkvIA==

详细实现步骤如下( 5 步)

3-1  创建爬虫项目

首先,我们使用「 feapder create -p 」命令创建一个爬虫项目

# 创建一个爬虫项目
feapder create -p tophub_demo

3-2  创建爬虫 AirSpider

命令行进入到 spiders 文件夹目录下,使用「 feapder create -s 」命令创建一个爬虫

cd spiders

# 创建一个轻量级爬虫
feapder create -s tophub_spider 1

其中

  • 1 为默认,表示创建一个轻量级爬虫 AirSpider

  • 2 代表创建一个分布式爬虫 Spider

  • 3 代表创建一个分布式批次爬虫 BatchSpider

3-3  配置数据库、创建数据表、创建映射 Item

以 Mysql 为例,首先我们在数据库中创建一张数据表

# 创建一张数据表
create table topic
(
    id         int auto_increment
        primary key,
    title      varchar(100)  null comment '文章标题',
    auth       varchar(20)   null comment '作者',
    like_count     int default 0 null comment '喜欢数',
    collection int default 0 null comment '收藏数',
    comment    int default 0 null comment '评论数'
);

然后,打开项目根目录下的 settings.py 文件,配置数据库连接信息

# settings.py

MYSQL_IP = "localhost"
MYSQL_PORT = 3306
MYSQL_DB = "xag"
MYSQL_USER_NAME = "root"
MYSQL_USER_PASS = "root"

最后,创建映射 Item( 可选 )

进入到 items 文件夹,使用「 feapder create -i 」命令创建一个文件映射到数据库

PS:由于 AirSpider 不支持数据自动入库,所以这步不是必须

3-4  编写爬虫及数据解析

第一步,首先使「 MysqlDB初始化数据库

from feapder.db.mysqldb import MysqlDB

class TophubSpider(feapder.AirSpider):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.db = MysqlDB()

第二步,在 start_requests 方法中,指定爬取主链接地址,使用关键字「download_midware 配置随机 UA

import feapder
from fake_useragent import UserAgent

def start_requests(self):
    yield feapder.Request("https://tophub.today/", download_midware=self.download_midware)

def download_midware(self, request):
    # 随机UA
    # 依赖:pip3 install fake_useragent
    ua = UserAgent().random
    request.headers = {'User-Agent': ua}
    return request

第三步,爬取首页标题、链接地址

使用 feapder 内置方法 xpath 去解析数据即可

def parse(self, request, response):
    # print(response.text)
    card_elements = response.xpath('//div[@class="cc-cd"]')

    # 过滤出对应的卡片元素【什么值得买】
    buy_good_element = [card_element for card_element in card_elements if
                        card_element.xpath('.//div[@class="cc-cd-is"]//span/text()').extract_first() == '什么值得买'][0]

    # 获取内部文章标题及地址
    a_elements = buy_good_element.xpath('.//div[@class="cc-cd-cb nano"]//a')

    for a_element in a_elements:
        # 标题和链接
        title = a_element.xpath('.//span[@class="t"]/text()').extract_first()
        href = a_element.xpath('.//@href').extract_first()

        # 再次下发新任务,并带上文章标题
        yield feapder.Request(href, download_midware=self.download_midware, callback=self.parser_detail_page,
                              title=title)

第四步,爬取详情页面数据

上一步下发新的任务,通过关键字「 callback 」指定回调函数,最后在 parser_detail_page 中对详情页面进行数据解析

def parser_detail_page(self, request, response):
    """
    解析文章详情数据
    :param request:
    :param response:
    :return:
    """

    title = request.title

    url = request.url

    # 解析文章详情页面,获取点赞、收藏、评论数目及作者名称
    author = response.xpath('//a[@class="author-title"]/text()').extract_first().strip()

    print("作者:", author, '文章标题:', title, "地址:", url)

    desc_elements = response.xpath('//span[@class="xilie"]/span')

    print("desc数目:", len(desc_elements))

    # 点赞
    like_count = int(re.findall('\d+', desc_elements[1].xpath('./text()').extract_first())[0])
    # 收藏
    collection_count = int(re.findall('\d+', desc_elements[2].xpath('./text()').extract_first())[0])
    # 评论
    comment_count = int(re.findall('\d+', desc_elements[3].xpath('./text()').extract_first())[0])

    print("点赞:", like_count, "收藏:", collection_count, "评论:", comment_count)

3-5  数据入库

使用上面实例化的数据库对象执行 SQL,将数据插入到数据库中即可

# 插入数据库
sql = "INSERT INTO topic(title,auth,like_count,collection,commentvalues('%s','%s','%s','%d','%d')" % (
title, author, like_count, collection_count, comment_count)

# 执行
self.db.execute(sql)

4. 最后

本篇文章通过一个简单的实例,聊到了 feapder 中最简单的爬虫 AirSpider

关于 feapder 高级功能的使用,后面我将会通过一系列实例进行详细说明

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Python 性能测试工具 Locust 极简入门

作者:dongfanger
来源:dongfanger
Locust是一款Python技术栈的开源的性能测试工具。Locust直译为蝗虫,寓意着它能产生蝗虫般成千上万的并发用户:
图片
Locust并不小众,从它Github的Star数量就可见一斑:
图片
截止文章写作时,一共15951Star。
Locust生态良好,它已在多家外企(包括世界500强)投入使用:
图片
如此看来,Locust是非常值得学习和掌握的一款工具。
Python的魔力在于化繁为简,基于Python的Locust也能给仍然困惑于性能测试的我们带来启发。


1.Locust特点

  • 以纯Python方式编写用户脚本,提供极大自由度。

  • 用户脚本可以串行方式编写,Locust会通过轻量级进程/协程产生并发,无需自己做并发编程。

  • 并发量大,借助于gevent库,Locust能产生成千上万并发请求。

  • 开销小,Locust用户运行时开销很小。

  • 良好的Web UI对性能结果实时监测。

  • 能测任何系统任何协议,只需要写个client即可。

  • 开放REST API,尽情发挥。


2.安装Locust

需要Python版本3.6及以上。
执行pip命令:
$ pip install locust
验证安装成功:
$ locust -V
安装时会一并安装依赖库:
Installing collected packages: Werkzeug, pywin32, zope.event, greenlet, gevent, geventhttpclient, itsdangerous, flask, Flask-BasicAuth, ConfigArgParse, pyzmq, psutil, locust
能看出来flask为Locust提供了Web功能。


3.快速上手

使用Locust一般按照以下步骤进行:
  1. 编写Python用户脚本。

  2. 使用locust命令执行性能测试。

  3. (可选)通过Web界面监测结果。

示例代码如下,新建locustfile.py文件:
import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
wait_time = between(1, 2.5)

@task
def hello_world(self):
self.client.get(“/hello”)
self.client.get(“/world”)

@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f”/item?id={item_id}, name=“/item”)
time.sleep(1)

def on_start(self):
self.client.post(“/login”, json={“username”:“foo”, “password”:“bar”})
路径切换到locustfile.py文件所在目录,执行命令:
$ locust
也可以通过-f指定某个目录文件:
$ locust -f locust_files/my_locust_file.py
运行后,打开http://127.0.0.1:8089看到Web界面:
图片
填写信息后,就能开始压测了。Web界面提供了结果统计数据:
图片
和性能指标走势图:
图片


4.脚本解析

示例脚本解析如下:
# Locust用户脚本就是Python模块
import time
from locust import HttpUser, task, between

# 类继承自HttpUser
class QuickstartUser(HttpUser):
# 每个模拟用户等待1~2.5秒
wait_time = between(1, 2.5)

# 被@task装饰的才会并发执行
@task
def hello_world(self):
# client属性是HttpSession实例,用来发送HTTP请求
self.client.get(“/hello”)
self.client.get(“/world”)

# 每个类只会有一个task被选中执行
# 3代表weight权重
# 权重越大越容易被选中执行
# view_items比hello_wolrd多3倍概率被选中执行
@task(3)
def view_items(self):
for item_id in range(10):
# name参数作用是把统计结果按同一名称进行分组
# 这里防止URL参数不同会产生10个不同记录不便于观察
# 把10个汇总成1个”/item”记录
self.client.get(f”/item?id={item_id}, name=“/item”)
time.sleep(1)

# 每个模拟用户开始运行时都会执行
def on_start(self):
self.client.post(“/login”, json={“username”:“foo”, “password”:“bar”})

小结

本文先了解了Locust的背景和生态,它是值得学习的,对于Python技术栈来说更加如此。接着介绍了使用pip命令安装Locust,其中发现顺带安装了flask,Locust的Web功能是flask提供的
然后给出了一段示例代码,按照步骤上手Locust。最后对示例代码进行了解析,浅尝辄止。locustfile实际上该怎么写呢?
参考资料:
https://locust.io/
https://docs.locust.io/en/stable/

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Birdseye 极其强大的Python调试工具

Birdseye是一个Python调试器,它在函数调用中记录表达式的值,并让你在函数**退出**后轻松查看它们。例如:

无论你如何运行或编辑代码,都可以使用Birdseye。只需要你安装好依赖:

pip install birdseye

并在代码函数上方添加 @eye 装饰器(如上所示),即可根据需要运行函数,并在浏览器中查看结果。

它还可以与一些常用工具集成在一起,如 Pycharm 和 Vscode,以提供更流畅的体验,后续我们会介绍如何将其与这些工具结合使用。

它不仅仅能够单步执行,还能在循环迭代中来回移动,并查看所选表达式的值如何变化:

通过 birdseye 你能很容易地知道哪些表达式引发了异常:

你也能够展开具体的数据结构和对象以查看其内容:

调用会按功能组织(文件组织)并进行时间排序进行显示,让你一目了然地看到发生了什么:

1.快速上手

首先,使用 pip 安装 birdseye :

pip install birdseye

然后,对需要进行调试的函数使用eye装饰器:

from birdseye import eye

@eye
def foo():

在你调用该函数完成后,在终端运行命令打开Birdseye的Web服务:

python -m birdseye

在浏览器打开 http://localhost:7777 就能看到需要调试的函数执行流程了。点击下图的按钮即可跳转到最新的函数调用。

2.Birdseye在Pycharm中集成调试

在 Pycharm 的 Settings 中,点击 Plugins 插件市场搜索 birdseye 点击 install 安装。

安装完成后重启Pycharm,就可以在 Pycharm 中使用 birdseye了:

默认情况下,该插件还可以为你自动运行Birdseye服务器,因此就不需要输入 python -m birdseye 那行命令了。

3.Birdseye在VSCode中集成调试

在VSCode中继承调试Birdseye也非常方便,点击左侧的扩展商店,在弹出框中输入搜索 birdseye,并点击 install 安装:

安装完成后,点击 F1 输入Birdseye,就能显示调试界面:

如果无法正常显示右侧调试界面,并提示未安装birdseye,但实际上你已经安装成功了,这一般是路径错误导致的,请在扩展设置中手动更改python路径为你安装了Birdseye的Python。

4.美中不足

Birdseye 是一个非常强大的调试工具,但我认为这还是有缺点可以改善的:

1.为了防止堆栈过大,每个迭代它最多只保留6个(前三、末三)元素:

因此如果你想看一些特殊元素值的执行情况,它可能不会如你所愿。

不过,不需要担心某些分支你调试不到,因为 birdseye 有个保险机制:如果一个表达式仅在某种特定情况下会被执行,那么执行时的元素也会被加入到可调试元素中

2.由于需要记录堆栈,程序会大大减慢速度,因此它绝对不适合上到生产环境。

3.每个函数调用,Birdseye 都需要收集许多数据,对于某些极其复杂的函数调用,可能会引发内存问题。

如果你不担心这三个缺点,而且希望能快速方便地看到函数中不同分支的执行情况,那么Birdseye就是你的不二之选。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Pyforest !自动导入代码所需的 Python 库

今天给大家介绍一个懒人 Python 库:Pyforest,只用一行代码,就能导入所有的 Python 库(本地已经安装的)。

项目地址:https://github.com/8080labs/pyforest

/ 01 / 介绍

Python 因为有着成千上万个功能强大开源库,备受大家的欢迎

目前,通过 PyPl 可以导入超过 23.5 万个 Python 库,数量庞大

在大家平常的实践当中,一般都是需要导入多个库或者框架来执行任务

而且每当新建一个程序文件时,都需要根据自己的需求导入相关的库

如果是相同类型的任务,比如想做一个数据可视化的小项目,可能会一直使用到某个库

如此,反复编写同一条 import 语句,就算是复制粘贴,也会感觉到麻烦,这时 Pyforest 库就可以上场了

Pyforest 是一个开源的 Python 库,可以自动导入代码中使用到的 Python 库

在进行数据可视化的时候,一般都需要导入多个库,比如 pandas、numpy、matplotlib 等等

使用了 Pyforest,每个程序文件中就不需要导入相同的 Python 库,而且也不必使用确切的导入语句

比如下面这行代码,就可以省略掉

from sklearn.ensemble import RandomForestClassifier

在你使用 import 语句导入Pyforest 库后,你就可以直接使用所有的 Python 库

import pyforest

df = pd.read_csv(‘test.csv’)
print(df)

你使用的任何库都不需要使用 import 语句导入,Pyforest 会为你自动导入。

只有在代码中调用库或创建库的对象后,才会导入库。如果一个库没有被使用或调用,Pyforest 将不会导入它。

/ 02 / 使用

安装,使用以下命令安装 Pyforest

pip install pyforest -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后,使用 import 语句导入它

现在,你可以直接使用相关的 Python 库,无需编写 import 导入

先以 jupiter notebook 为例,我们没有导入 pandas、seaborn 和 matplotlib 库,但是我们可以通过导入 Pyforest 库直接使用它们

图片

读取数据,这个是国内棉花产量排行前三的省份,新疆全国第一(数据来源:国家统计局)

图片

那么 Pyforest 可以导入所有库吗?

目前这个包包含了大部分流行的 Python 库,比如

pandas as pd
NumPy as np
matplotlob.pyplot as plt
seaborn as sns 

除了这些库之外,它还提供了一些辅助的 Python 库,如 os、tqdm、re 等

如果你想查看库列表,可以使用 dir(pyforest) 进行查看,内置的是 68 个库

import pyforest

print(len(dir(pyforest)))
for i in dir(pyforest):
    print(i)

————————-
68
GradientBoostingClassifier
GradientBoostingRegressor
LazyImport
OneHotEncoder
Path
RandomForestClassifier
RandomForestRegressor
SparkContext
TSNE
TfidfVectorizer

如果没有的话,可以进行自定义添加,在主目录中的文件写入 import 语句

示例如下

vim ~/.pyforest/user_imports.py

添加语句,此处便能在代码中使用 requests 这个库

# Add your imports here, line by line
# e.g
# import pandas as pd
# from pathlib import Path
# import re

import requests as req
~                                                                               
~                                                                                                                                                                                                      
“~/.pyforest/user_imports.py” 7L129C

这回我们在 PyCharm 中来实验一下。

图片

发现 PyCharm 的自动补全的功能失效了,看来这个库还是比较适合 jupyter notebook(自动补全代码还可以使用)

除了上面这个地方可以自定义添加,还可以在库的 _import.py 文件中添加

此处以 Pyechars 为例,缩写为 chart

图片

可视化代码如下

图片

新疆棉花产量年年上升,其它省份年年下降…

最后 Pyforest 还提供了一些函数来了解库的使用情况

# 返回已导入并且正在使用的库列表
print(pyforest.active_imports())
——————————–
[‘import pandas as pd’‘import requests as req’‘import pyg2plot’]


# 返回pyforest中所有Python库的列表
print(pyforest.lazy_imports())
——————————–
[‘import glob’‘import numpy as np’‘import matplotlib.pyplot as plt’…]

只有代码中有使用到的库,程序才会 import 进去,否则不会导入的哦!

/ 03 / 总结

好了,到此本期的分享就结束了

使用 Pyforest 库有时候确实是可以节省一些时间,不过也是有弊端存在的。比如调试的时候(大型项目),可能会很痛苦,不知道是哪里来的库

所以建议大家,在一些独立的脚本程序中使用,效果应该还是不错的

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

Python 下划线_的五大作用—临时变量、保护变量、私有变量、魔术方法…

图片

Python有很多地方使用下划线。在不同场合下,有不同含义:比如_var表示内部变量;__var表示私有属性;__var__表示魔术方法;这些含义有的是程序员群体的约定,如_var;有的是Python解释器规定的形式,如__var

本文总结Python语言编程中常用下划线的地方,力图一次搞懂_用法。目前常见的用法有五种:

  • _用于临时变量
  • var_用于解决命名冲突问题
  • _var用于保护变量
  • __var用于私有变量
  • __var__用于魔术方法

下面我们具体看看这些下划线应用场景。

一、_用于临时变量

单下划线一般用于表示临时变量,在REPL、for循环和元组拆包等场景中比较常见。

1.1 REPL

单下划线在REPL中关联的是上一次计算的非None结果。

>>> 1+1
2
>>> _
2
>>> a=2+2
>>> _
2

1+1,结果为2,赋值给_;而赋值表达式a=2+2a为4,但整个表达式结果为None,故不会关联到_。这有点类似日常大家使用的计算器中的ANS按键,直接保存了上次的计算结果。

1.2 for循环中的_

for循环中_作为临时变量用。下划线来指代没什么意义的变量。例如在如下函数中,当我们只关心函数执行次数,而不关心具体次序的情况下,可以使用_作为参数。

nums = 13
for _ in range(nums):
    fun_oper()

1.3 元组拆包中的_

第三个用法是元组拆包,赋值的时候可以用_来表示略过的内容。如下代码忽略北京市人口数,只取得名字和区号。

>>> city,_,code = ('Beijing',21536000,'010')
>>> print(city,code)
Beijing 010

如果需要略过的内容多于一个的话,可以使用*开头的参数,表示忽略多个内容。如下代码忽略面积和人口数,只取得名字和区号

city,*_,code = ('Beijing',21536000,16410.54,'010')

1.4 国际化函数

在一些国际化编程中,_常用来表示翻译函数名。例如gettext包使用时:

import gettext
zh = gettext.tranlation('dict','locale',languages=['zh_CN'])
zh.install()
_('hello world')

依据设定的字典文件,其返回相应的汉字“你好世界”。

1.5 大数字表示形式

_也可用于数字的分割,这在数字比较长的时候常用。

>>> a = 9_999_999_999
>>> a
9999999999

a的值自动忽略了下划线。这样用_分割数字,有利于便捷读取比较大的数。

二、var_用于解决命名冲突问题

变量后面加一个下划线。主要用于解决命名冲突问题,元编程中遇时Python保留的关键字时,需要临时创建一个变量的副本时,都可以使用这种机制。

def type_obj_class(name,class_):
    pass

def tag(name,*content,class_):
    pass

以上代码中出现的class是Python的保留关键字,直接使用会报错,使用下划线后缀的方式解决了这个问题。

三、_var用于保护变量

前面一个下划线,后面加上变量,这是仅供内部使用的“保护变量”。比如函数、方法或者属性。

这种保护不是强制规定,而是一种程序员的约定,解释器不做访问控制。一般来讲这些属性都作为实现细节而不需要调用者关心,随时都可能改变,我们编程时虽然能访问,但是不建议访问。

这种属性,只有在导入时,才能发挥保护作用。而且必须是from XXX import *这种导入形式才能发挥保护作用。

使用from XXX import *是一种通配导入(wildcard import),这是Python社区不推荐的方式,因为你根本搞不清你到底导入了什么属性、方法,很可能搞乱你自己的命名空间。PEP8推荐的导入方式是from XXX import aVar , b_func , c_func这种形式。

比如在下例汽车库函数tools.py里定义的“保护属性”:发动机型号和轮胎型号,这属于实现细节,没必要暴露给用户。当我们使用from tools import * 语句调用时,其实际并没有导入所有_开头的属性,只导入了普通drive方法。

_moto_type = 'L15b2'
_wheel_type = 'michelin'

def drive():
    _start_engine()
    _drive_wheel()

def _start_engine():
    print('start engine %s'%_moto_type)
    
def _drive_wheel():
    print('drive wheel %s'%_wheel_type)

查看命令空间print(vars())可见,只有drive函数被导入进来,其他下划线开头的“私有属性”都没有导入进来。

{'__name__''__main__''__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x005CF868>, '__spec__': None, '__annotations__':{}, '__builtins__': <module 'builtins' (built-in)>, '__file__''.\\xiahuaxian.py''__cached__': None, 'walk': <function walk at 0x01DA8C40>, 'root''.\\__pycache__''_': [21536000, 16410.54], 'dirs': ['tools.cpython-38.pyc'], 'city''Beijing''code''010''drive': <function drive at 0x01DBC4A8>}

3.1 突破保护属性

之所以说是“保护”并不是“私有”,是因为Python没有提供解释器机制来控制访问权限。我们依然可以访问这些属性:

import tools
tools._moto_type = 'EA211'
tools.drive()

以上代码,以越过“保护属性”。此外,还有两种方法能突破这个限制,一种是将“私有属性”添加到tool.py文件的__all__列表里,使from tools import *也导入这些本该隐藏的属性。

__all__ = ['drive','_moto_type','_wheel_type']

另一种是导入时指定“受保护属性”名。

from tools import drive,_start_engine
_start_engine()

甚至是,使用import tools也可以轻易突破保护限制。所以可见,“保护属性”是一种简单的隐藏机制,只有在from tools import *时,由解释器提供简单的保护,但是可以轻易突破。这种保护更多地依赖程序员的共识:不访问、修改“保护属性”。除此之外,有没有更安全的保护机制呢?有,就是下一部分讨论的私有变量。

四、__var用于私有变量

私有属性解决的之前的保护属性保护力度不够的问题。变量前面加上两个下划线,类里面作为属性名和方法都可以。两个下划线属性由Python的改写机制来实现对这个属性的保护。

看下面汽车例子中,品牌为普通属性,发动机为“保护属性”,车轮品牌为“私有属性”。

class Car:
    def __init__(self):
        self.brand = 'Honda'
        self._moto_type = 'L15B2'
        self.__wheel_type = 'michelin'

    def drive(self):
        print('Start the engine %s,drive the wheel %s,I get a running %s car'%
        (self._moto_type,
        self.__wheel_type,
        self.brand))

我们用var(car1)查看下具体属性值,

['_Car__wheel_type''__class__''__delattr__''__dict__''__dir__''__doc__''__eq__''__format__''__ge__''__getattribute__''__gt__''__hash__''__init__''__init_subclass__''__le__''__lt__''__module__''__ne__''__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__''__subclasshook__''__weakref__''_moto_type''brand''drive']

可见,实例化car1中,普通属性self.brand和保护属性self._moto_type都得以保存,两个下划线的私有属性__wheel_type没有了。取而代之的是_Car_wheel_type这个属性。这就是改写机制(Name mangling)。两个下划线的属性,被改写成带有类名前缀的变量,这样子类很难明明一个和如此复杂名字重名的属性。保证了属性不被重载,保证了其的私有性。

4.1 突破私有属性

这里“私有变量”的实现,是从解释器层面给与的改写,保护了私有变量。但是这个机制并非绝对安全,因为我们依然可以通过obj._ClasssName__private来访问__private私有属性。

car1.brand = 'Toyota'
car1._moto_type = '6AR-FSE'
car1._Car__wheel_type = 'BRIDGESTONE'
car1.drive()

结果

Start the engine 6AR-FSE,\
drive the wheel BRIDGESTONE,\
I get a running Toyota car

可见,对改写机制改写的私有变量,虽然保护性加强了,但依然可以访问并修改。只是这种修改,只是一种杂耍般的操作,并不可取。

五、__var__用于魔术方法

变量前面两个下划线,后面两个下划线。这是Python当中的魔术方法,一般是给系统程序调用的。例如上例中的__init__就是类的初始化魔术方法,还有支持len函数的__len__方法,支持上下文管理器协议的__enter__和__exit__方法,支持迭代器协议的__iter__方法,支持格式化显示的__repr__和__str__方法等等。这里我们为上例的Car类添加魔术方法__repr__来支持格式化显示。

    def __repr__(self):
        return '***Car %s:with %s Engine,%sWheel***'%
        (self.brand,self._moto_type,self.__wheel_type)

未添加__repr__魔术方法之前,print(car1)结果为<__main__.Car object at 0x0047F7F0>,这个结果让人看的一头雾水,增加repr魔术方法之后,显示结果为***Car Toyota:with 6AR-FSE Engine,BRIDGESTONE Wheel***清晰明了,利于调试。这就是魔术方法的功效:支持系统调用,改进用户类表现,增加协议支持,使用户类表现得更像系统类。

5.1 Python魔术方法分类

以下所有魔术方法均需要在前后加上__,这里省略了这些双下划线。

  • 一元运算符 neg pos abs invert
  • 转换 complex int float round inex
  • 算术运算 add sub mul truediv floordiv mod divmod pow lshift rshift and xor or

算术运算除and之外,前面再加上r,表示反运算。除dimod外,前面加上i,表示就地运算。

  • 比较 lt le eq ne gt ge
  • 类属性 getattr getattribute setattr delattr dir get set delete
  • 格式化 bytes hash bool format
  • 类相关 init del new
  • 列表 getitem
  • 迭代器 iter next
  • 上下文管理器 enter exit

六、总结

总之,下划线在 Python 当中应用还是很广泛的,甚至可以说 Python 对下划线有所偏爱

可以看到 _常用于临时变量,在REPL,for循环,元组拆包和国际化中得到了广泛应用

var_用于解决命名冲突问题,使用时比较简单易懂的。_var对变量的保护,只是一种脆弱的保护,更多依靠程序员的约定。__var用于私有变量,借助改写机制支持,已经支持了私有变量,但是仍然存在漏洞

__var__用于魔术方法,进行了一个简单的介绍,魔术方法较多,但是理解并不复杂。希望以后可以进一步介绍这些魔术方法

继续阅读Python 下划线_的五大作用—临时变量、保护变量、私有变量、魔术方法…

整理的关于 pip 的 15 个使用小技巧

 

本文转载自公众号【 Python大数据分析】

认识pip

众所周知,pip可以对python的第三方库进行安装、更新、卸载等操作,十分方便。

pip的全称:package installer for python,也就是Python包管理工具。

可能有些人用了很久pip,但还不清楚包管理工具是个啥。

我们先从Python这门语言说起,Python之所以受欢迎不光是因为它简单易学,更重要的是它有成千上万的宝藏库。

这些库相当于是已经集成好的工具,只要安装就能在Python里使用。它们可以处理各式各样的问题,无需你再造轮子,而且随着社区的不断更新维护,有些库越来越强大,几乎能媲美企业级应用。

那么这些工具库怎么下载安装呢?它们被放在一个统一的“仓库”里,名叫PyPi(Python Package Index),所有的库安装都是从这里调度。

有了仓库之后,还需要有管理员,pip就是这样一个角色。pip把库从PyPi取出来,然后安装到Python里,还可以管理安装好的库,比如更新、查看、搜索、卸载等等。

总的来说,pip的Python第三方库的大管家,搞懂它,会让你省很多事。

下面总结了30个pip使用过程中的常识和技巧,供大家参考。

「注:因为pip是一个命令行程序,所以pip一般都在命令行中执行各种操作」

1、安装pip

从Python 3.4开始,pip已经内置在Python中,所以无需再次安装。

如果你的Python版本没有pip,那可以使用下面两种方法安装。

(1) 命令行中输入easy_install pip,非常快捷

(2) 在下面网址中下载pip安装文件,然后解压到python scripts目录中,执行python setup.py install安装即可

下载网址:https://pypi.org/project/pip/#files

下载文件:图片

2、查看pip版本

pip --version图片

3、升级pip

如果pip的版本太低,可以升级当前版本
pip install --upgrade pip

4、获取帮助

想了解如何使用pip,以及pip有哪些功能,执行下面语句可以获取详细教程:
pip help

5、安装库

使用pip安装第三方库,执行下面语句
pip install package_name

指定package版本:
pip install package_name==1.1.2

比如说,我要安装3.4.1版本的matplotlib
pip install matplotlib==3.4.1

6、批量安装库

如果一个项目需要安装很多库,那可以批量安装:
pip install -r e:\\requirements.txt

requirements.txt文件内容格式如下:图片

7、使用wheel文件安装库

这种方法适合离线安装,wheel文件是库的源文件,可以下载后放到本地安装。

步骤如下:

(1) 在下面网站里找相应库的.whl文件
https://www.lfd.uci.edu/~gohlke/pythonlibs/

(2) 下载.whl文件,注意对应的版本
图片

(3) 在.whl所在文件夹内,按Shift键+鼠标右键,打开CMD窗口或者PowerShell

(4) 输入命令:
pip install matplotlib‑3.4.1‑cp39‑cp39‑win_amd64.whl
即可完成安装

8、卸载库

安装好的库可以再卸载:
pip uninstall package_name

9、升级库

对当前库进行版本升级:
pip install --upgrade package_name

10、查看库信息

pip show -f package_name
图片

11、查看已安装的库

列出所有已安装的第三方库和对应版本
pip list图片

12、将库列表保存到指定文件中

把已经安装的库信息保存到到本地txt文件中:
pip freeze > requirements.txt图片

13、查看需要升级的库

目前已经安装的库中,看哪些需要版本升级
pip list -o

图片

14、检查兼容问题

验证已安装的库是否有兼容依赖问题
pip check package-name

图片

15、下载库到本地

将库下载到本地指定文件,保存为whl格式
pip download package_name -d "要保存的文件路径"

图片

附:更换pip源

很多人抱怨pip安装库有些时候太慢了,那是pip源的问题。

前面说过pip从PyPi中下载库文件,但由于PyPi服务器在国外,访问起来很慢。

但国内提供了很多镜像源,用来替代PyPi,像清华源、豆瓣源、阿里云源等。

这些镜像源备份了PyPi里的数据,由于服务器在国内,速度会快很多。

但镜像源数据有滞后性,比如说清华源的pypi 镜像每 5 分钟同步一次。

使用镜像源有两种方式,以清华源为例:

(1) 临时使用

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package matplotlib

除了matplotlib是要安装的库名外,其他都是固定格式

(2) 设为默认

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

设为默认后,以后安装库都是从清华源下载,而且无需再加镜像源网址

附主流镜像源地址

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

超详细快速部署 Python 脚本到手机上

图片

1. 前言

最近有读者后台给我留言,说这段时间云服务器涨价了,自己日常就运行一些简单的脚本,因此不太想入坑云服务器,问我能不能提供一个不一样的思路给他

本篇文章将介绍一款软件,即:iSH

这款 App 功能非常强大,可以运行各种脚本,适用于需求不是很大的小伙伴

2. 介绍

iSH 是一款运行在 iOS 系统上的 App,可以运行 Linux Shell,底层操作系统基于「 Alpine 

PS:Alpine 是一个超轻量级的 Linux 发行版,是一个由社区开发的 Linux 操作系统,该操作系统以安全为理念,面向 x86 路由器、防火墙、虚拟专用网、IP 电话盒及服务器而设计

项目地址:

https://github.com/ish-app/ish/

安装有 2 种方式,分别是:

  • App Store 搜索关键字「 iSH 」下载

  • Github 下载源码,使用 Xcode 编译安装

App 界面如下,从左往右,功能键包含:Tab 键、Ctrl 键、ESC 键、滚动键( Arrow 键)、软件设置、快速粘贴键、隐藏输入法

其中,

Tab 键、Ctrl 键、ESC 键和 PC 端使用方法一致

滚动键用于光标移动和历史命令切换( 通过向上、向下滑动来切换历史命令 )

设置中,可以对外观主题、文字样式、应用图标、文件管理进行查看设置

图片

3. 更换源及安装依赖

由于默认的源在国外,下载依赖很慢,我们需要更换源

使用 vim 命令编辑文件 「 /etc/apk/repositories 」,删除默认的源,更换为阿里或者清华的源

# 编辑文件
vim /etc/apk/repositories

# 替换为国内的源
# 阿里源
https://mirrors.aliyun.com/alpine/v3.11/main
https://mirrors.aliyun.com/alpine/v3.11/community

编辑完成后,保存退出

下面就可以安装 Python 及常见依赖库了

3-1  安装 Python3

iSH 使用命令「 apk add app_name 」安装应用程序

# 安装python3
apk add python3

3-2  安装 pip

首先,我们使用「 wget 」命令下载 pip 文件,然后安装 pip

# 下载get-pip文件
wget https://bootstrap.pypa.io/get-pip.py

# 安装
python3 get-pip.pya

3-3  安装依赖包

以最常见的 requests 为例,直接使用 pip3 安装即可

# 安装依赖
pip3 install requests

需要注意的是,iSH 安装速度比较慢,需要耐心等待

图片

4. 执行脚本

由于手机上编辑脚本效率太低,大部分时候我们都是在 PC 端编写完成,然后导入到 iSH 中运行

常见方案为 iSH + SSH + Git,为了演示方便,我这里使用「 Web Server for Chrome 」在 PC 端搭建了文件共享服务器,然后将脚本文件放置到共享目录

然后再 iSH 终端,使用 wget 命令直接下载脚本文件

最后,进入到脚本文件夹目录,运行脚本文件即可

# 下载脚本文件压缩包
wget http://192.168.2.121:8887/rsc.zip

# 解压文件
unzip rsc.zip

# 进入到文件夹目录
cd rsc/

# 运行脚本文件
python3 main_proj.py

5. 拓展一下

iSH 常见命令如下:

5-1  安装

apk add <name>
apk add vim
apk add python3

5-2  卸载

# 卸载应用
apk del <name>

5-3  搜索应用

# 搜索应用
# PS:可以先搜索,然后再安装
apk search <name>

5-4  更新包管理器

iSH 使用 Alpine 包管理器,使用下面的命令可以更新 Alpine 存储库列表

# 更新存储库列表
apk update

6. 总结

iSH 作为一款 iOS 端的应用,可以非常便捷地完成 Python 脚本的部署运行,当然 Shell 脚本也是支持的

另外,iSH 可以开启 SSH Server 供远程连接,这部分内容及 iSH 详细使用文档我已经写成 PDF 并上传到后台,回复关键字「 iSH 」获取完整内容

图片

 

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pandas 性能优化

有趣好用的Python教程