分类 python 下的文章

笔记:numpy的数组乘法

有些忘记了,写一下,备忘。

——by realasking

In [1]: import numpy as np

In [2]: A=np.array([[1,2],[3,4]])

直接乘是对应元素相乘:

In [3]: A*A
Out[3]:
array([[ 1,  4],
        [ 9, 16]])

做矩阵乘法要用dot,下面的是A^2:

In [4]: np.dot(A,A)
Out[4]:
array([[ 7, 10],
        [15, 22]])

叉乘用cross:

In [5]: np.cross(A,A)
Out[5]: array([0, 0])

python工程的打包和发布

个人笔记,如有转载,请注明出处。

——by realasking

最近弄的essential-pathway是我第一次直接发布自己写的小程序,通过折腾这个东西,对纯python程序包的打包和发布有了一定的了解,故作个记录,备忘。

python程序打包的时候,要将库和执行脚本或程序分开放,同时还要有一些其它定义文件,从工程目录开始,按目录结构,其文件和放置顺序如下:

1.工程目录

此目录下要放置至少两个文件夹和若干文件,两个文件夹分别是bin和以库命名的文件夹(假定为A),其中bin/下放置可执行文件或脚本b,A下放置作为库的.py文件,此外还可以建立文件夹放置非代码的数据文件c等。

此目录下除文件夹之外的其它文件包括但不仅限于setup.py,MANIFEST.in,LICENSE,README.md,requirements.txt , changelog.md。

1-1 setup.py

setup.py应当包含形如以下一些内容:

#!/usr/bin/env python
from setuptools import setup, find_packages

with open('README.md') as buff:
longdes = buff.read()

with open('changelog.md') as buff:
longdes += buff.read()

CLASSIFIERS = [
'Programming Language :: Python :: 3',
'Topic :: Utilities',
'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)',
'Development Status :: 5 - Production/Stable',
]

setup(
name='工程名',
version='版本号',
keywords=['关键字1','关键字2'],
description='简单说明',
long_description=longdes,
author='realasking',
author_email='[email protected],[email protected]',
url='项目发布地址',
packages=find_packages(),
include_package_data=True,
install_requires=['在python中的依赖包'],
scripts=['bin/b'],
platforms=['linux','cygwin','freebsd','Unix'],
classifiers=CLASSIFIERS,
)

该文件中,setup()区域内,有很多参数都要求使用list,比如keywords,install_requires, scripts,platforms和classifiers等,不然可能会报不是对象的错误。

其中引用的README.md是说明文件,如果发布在github上,可以采用markdown格式;

changelog是程序更新历史文件,是一个简单的文本文件。

CLASSIFIERS的可选内容可以在pypi查到,根据需要选择即可,其中“License :: OSI Approved :: ”指代的协议内容可以到OSI 查询,无论使用哪个,应当将所选协议内容拷贝到LICENSE文件中,随软件包发布。

url的指向自己项目要发布的地方,可以先申请下来填在这里

scripts就是可执行文件的列表了,这里面的文件在安装时会安装到指定的程序运行路径中去,如果是脚本文件,只要文件中开头指定了正确的解释器,比如#!/bin/bash或#!/bin/env python之类,文件本身可以没有扩展名。如果要包含数据文件,最好不要在setup.py中设置,而是在MANIFEST.in文件中设置。

platforms是脚本可以支持的平台,可以在python文档 中查询。

如果有数据文件时,在MANIFEST.in中设置了数据文件的情况下,数据文件不能安装到系统中,则应该删除掉“include_package_data=True, ”这一行语句。

1-2 MANIFEST.in

这是用来包含杂项文件的一个文件定义,其内容类似下方定义:

include changelog.md  LICENSE README.md  requirements.txt
recursive-include bin *.*
recursive-include A *.*

如果要添加数据文件,可以将如下语句添加:

include 数据文件相对路径/数据文件

然后在python的脚本中使用数据文件时:

import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()

此法来自于stackoverflow 。

1-3 requirements.txt

其中填写python依赖包,一行一个。

2.目录A下

包含至少如下文件:一个__init__.py文件,和若干.py结尾的python库(比如aa.py,bb.py,cc.py)的脚本文件

2-1 __init__.py形如以下所示:

#!/usr/bin/env python
__all__=["aa","bb","cc"]
from . import aa
from . import bb
from . import cc

__name__='项目名'
__version__ = '版本号'
__short_description__ = '短描述'
__author__ = 'realasking'
__author_email__ ='<[email protected],[email protected]>'
__license__ = '协议'

__all__是用于在程序调用库的时候使用from A import aa之类的用法而指定的,而from . import aa之类则是准许程序调用库时直接用import A导入整个库。

2-2库文件编写时的注意事项

以aa.py为例,如果其中定义了新的class,那么class应当使用aa以外的名字,否则在其它程序调用库中aa来产生一个实例的时候,就需要用:

import A

II=A.aa.aa()

这样的形式,若将class命名为ab,则清楚很多:

import A

II=A.aa.ab()

另外,一个文件中写多个class的时候,import 可以写在所有class开始定义之前,而若bb.py要调用aa.py中的class,则在bb的import段书写from A import aa之类的即可。

这一切都完成之后,就是打包发布了,python程序的发布,可以直接发布到pypi上,也可以先发布到一个代码托管平台,比如github,github平台上新建项目和发布方法可见git初步使用 ,也可以使用我做的一个简单脚本giteasy 。

3使用pypi

对于python的程序,即使在github上发布过,也最好提交到pypi上,这样能够通过pip之类的工具被人自动的获取和安装,pypi的使用和程序提交过程如下。

3-1注册

进入pypi首页 ,点击右边的register链接,输入用户名,密码和邮箱地址,然后到自己的邮箱中进行验证即可,如果需要使用pgp或gpg key,相关key需要先提交到公共服务器上,具体操作见阮一峰:GPG入门教程 。

3-2提交程序

python setup.py register

然后输入用户名和密码。

python setup.py sdist upload

即可。

另一个更安全的方法:

pip install twine

twine register dist/包名.whl

twine upload dist/*

至于详细的文献资料,python官方文档 就十分不错。

做了个小工具essential-pathway

个人作品说明,如有转载,请注明作者和出处。

——by realasking

工具下载地址:

github pypi

以前就一直觉得在命令行下切换各个目录很头疼,而且总是忘记哪些目录在用,所以后来就自己写了好几个shell脚本来管理在使用的目录,并提醒自己其中的内容。最近几天,突然萌生了把它们整理一下、打成一个包的念头,不过没有想到的是,做着做着突然觉得还不如干脆用python来整个重写一遍,结果最后就做出了这么个东西。

这个小工具是用python3.6开发的,以LGPLv3发布,兼容性并未进行多少测试,目前只在64位archlinux上使用着。它用python调用sqlite3来管理常用路径,并生成包含数据内记录路径的modulefile供Tcl版的environment module来读取,以生成新的环境变量供用户调用,而在列表显示内部的路径时,需要调用python的prettytable库,所以该工具在安装前,需要先安装配置module和prettytable。

prettytable直接用pip install prettytable即可安装。

module在archlinux上用yaourt -S env-modules-tcl安装,在安装完成后,需要在$HOME下建立文件.modulespath,其内容为存放modulefile的目录位置,然后还需要在.bashrc中添加如下两行:
export MODULEPATH=${HOME}/env/module_files:$MODULEPATH
source /etc/modules-tcl/init/bash
下次登录bash即可启用module了。

本工具所生成的modulefile叫epath,要启用它,则需要在以上两行之后另起一行,添加以下内容:

module load epath

这一步建议在本工具安装完成并至少运行一次后操作

设置完成后,用pip install essential-pathway安装本工具,然后执行ep,就可以看到各种功能的使用说明了,举个例子,比如要将当前目录加入到pathway中,并将此pathway命名为myhome,执行:

ep a myhome

然后执行:

ep l

显示:

然后执行:

[realasking@Laptop Documents]$cd ~
[realasking@Laptop ~]$module load epath
[realasking@Laptop ~]$cd "$myhome"
[realasking@Laptop Documents]$

可以看到,环境变量myhome就生效了。

同样的,该工具还支持评注(备忘)、删除、刷新、备份、卸载环境变量设置等功能,需要注意的是,每次使用该命令前,请先执行一次module unload epath,否则可能会出现一些问题,在所需操作都执行完之后,需要让所有的pathway都生效,则可以再执行一次module load epath,当然,如果将这一句导入到了.bashrc中,则重新登录shell就可以了。

有兴趣的朋友可以试试,欢迎大家提意见,但限于个人精力和能力,本人不保证此工具的有效性及稳定性,也不一定能及时回复大家的关切,还望大家海涵。

最新文章

最近回复

  • realasking: 哪里的话,还要非常感...
  • cnfczn: 发送留言报错:in_...
  • cnfczn: 大狮兄666,以前经...
  • realasking: 最近还行啊,就是上网...
  • cnfczn: 大狮兄,好久不见啊....
  • realasking: 您好。有什么问题就在...
  • Eric Chen: 作者你好!最近折腾中...

分类

归档

其它