笨方法学Python练习46:一个项目的骨架

操作环境:Debain ×64
常见liunx命令大全:http://blog.csdn.net/pony_kinght/article/details/78510168

建立骨架内容

~ $ mkdir -p projects
~ $ cd projects/
~/projects $ mkdir skeleton
~/projects $ cd skeleton
~/projects/skeleton $ mkdir bin NAME tests docs

mkdir dir –创建目录
mkdir -p dir –创建递归目录

参数P代表parents,表示递归创建目录。
列如:
如果要创建目录A并创建目录A的子目录B,没有用-p的情况下是mkdir 2次
如果用-p 可以直接创建2个目录 mkdir -p 目录A/子目录B就可以。

cd file_name –打开文件

配置初始文件

~/projects/skeleton $ touch NAME/__init__.py
~/projects/skeleton $ touch tests/__init__.py

touch file_name –创建文件

建立setup.py
touch setup.py

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup
config = {
    'description': 'My Project',
    'author': 'My Name',
    'url': 'URL to get it at.',
    'download_url': 'Where to download it.',
    'author_email': 'My email.',
    'version': '0.1',
    'install_requires': ['nose'],
    'packages': ['NAME'],
    'scripts': [],
    'name': 'projectname'
}
setup(**config)

从setuptools 导入 setup, 然后编写 setup()函数,这个函数里面有相当多的属性,比如version 代表版本号,description 是描述文档,author是作者等,如果是正规的开发,所有这些东西都应该按照规范去写。其中比较重要的几个选项是:
name,表示模块的名称
packages,表示包所在的目录

其他还有很多写法,这篇博文总结的很好,http://www.cnblogs.com/UnGeek/p/5922630.html,需要的朋友可以参考下。

有的时候我们写的代码需要引入一些额外的信息文件,比如文本文件,或者图片,说明文件等等,这些东西是需要一块打包的,那么这个时候该如何指定呢?此时需要用到 data_files 这个选项了。data_files的写法是:data_files= [(‘文件要放入的文件夹1’,[‘file1’,file2’]),(‘文件要放入的文件夹2’,[‘file3’,file4’])],file1,file2等是文件的名称,注意data_files的元素都是元组,元组的第一个元素是文件要放入的文件夹名称,第二个元素是文件列表。这里需要注意的是,如果不想把文件放入文件夹,可以将元组的第一个元素指定为空字符串,此时要打包的文件要被放入根目录,这里根目录是指python解释器所在的目录。比如我需要将文件资源放入python解释器所在目录下的/Lib/site-packages/myfolder路径,myfolder是自定义的文件夹,元组的第一个元素就可以写‘Lib/site-packages/myfolder’,打包时会自动在指定位置新建一个名为myfolder的目录,将文件资源放入其中。

其实 setup.py 文件的编写还有非常多的内容,这里只是介绍了九牛一毛。后面接触到了更复杂的再继续补充吧。具体还是要参考官方文档。

最后一步就是打包命令了。这篇文章讲的非常详细:http://blog.csdn.net/lynn_kong/article/details/17540207,大家自行参考。

简单来说,linux下的打包命令是:python setup.py sdist 为模块创建一个源码包。在windows下,可以使用 python setup.py bdist_wininst 生成一个exe文件。双击该exe文件,就会弹出python库的安装界面(就是经典的蓝色界面),可以自己选择要安装的位置(特别是电脑中有多个版本的python的时候,需要指定这个库装到哪个python库目录下),一路下一步,就安装成功了。此时去指定的python库目录下,就会发现多出了一些我们自己安装的文件以及文件夹。此时试着import一下,就会发现已经可以导入我们自己的模块了。

setup函数的一些参数


packages
告诉Distutils需要处理那些包(包含__init__.py的文件夹)
package_dir
告诉Distutils哪些目录下的文件被映射到哪个源码包,感觉好像是一个相对路径的定义。一个例子:package_dir = {'': 'lib'},表示以lib为主目录。
ext_modules
是一个包含Extension实例的列表,Extension的定义也有一些参数。
ext_package
定义extension的相对路径
requires
定义依赖哪些模块
provides
定义可以为哪些模块提供依赖
scripts
指定python源码文件,可以从命令行执行。在安装时指定--install-script
package_data
通常包含与包实现相关的一些数据文件或类似于readme的文件。
package_data = {'': ['*.txt'], 'mypkg': ['data/*.dat'],}
表示包含所有目录下得txt文件和mypkg/data目录下的所有dat文件
data_files
指定其他的一些文件(如配置文件)

建立骨架测试文件
命令:cd tests
命令:touch NAME_tests.py

from nose.tools import *
import NAME
def setup():
    print "SETUP!"
def teardown():
    print "TEAR DOWN!"
def test_basic():
    print "I RAN!"

安装软件包

1. pip – http://pypi.python.org/pypi/pip
命令 sudo apt-get install python-pip

简介:

pip是一个以Python计算机程序语言写成的软件包管理系统,他可以安装和管理软件包

pip的其中一个主要特点就是其方便使用的命令列界面,这让使用者可以透过以下的一句文字命令来轻易地安装Python软件包:

pip install some-package-name

此外,使用者也可以轻易地透过以下的命令来移除软件包:

pip uninstall some-package-name

pip也拥有一个透过“需求”档案来管理软件包和其相应版本数目的完整列表之功能,这容许一个完整软件包组合可以在另一个环境(如另一部电脑)或虚拟化环境中进行有效率的重新创造。这个功能可以透过一个已正确进行格式化的文字档案和以下的命令来完成:

pip install -r requirements.txt

2. distribute – http://pypi.python.org/pypi/distribute
命令:sudo apt intall python-distribute

通过查阅 Distribute 的文档 https://pythonhosted.org/distribute/ 可知,目前它是 setuptools 的一个弃用版本。自从 setuptools0.7 发布之后,这两种工具已经合并,并且 distribute 也就没有再被提起过了。不过由于 setuptools 不支持 Python3 ,故在将来, distribute 将会有很大程序的优化和完善。

3. nose – http://pypi.python.org/pypi/nose/
命令:sudo apt intall python-nose
nose是用于python程序单元测试的第三方包

4. virtualenv – http://pypi.python.org/pypi/virtualenv
命令:sudo apt intall python-virtualenv

virtualenv 用来创建隔离的Python环境
建立一个虚拟环境:virtualenv 目录名
damao@damao:~$ virtualenv ~/Desktop/virtualpython

Running virtualenv with interpreter /usr/bin/python2
New python executable in /home/damao/Desktop/virtualpython/bin/python2
Also creating executable in /home/damao/Desktop/virtualpython/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
激活一个虚拟环境:进入上一步创建的目录执行 source bin/activate
damao@damao:~/Desktop/virtualpython$ source bin/activate

(virtualpython) damao@damao:~/Desktop/virtualpython$

激活成功的话,提示符前面会显示之前创建的虚拟环境的名称
虚拟环境下安装包:使用pip或setup.py都行
## 在虚拟环境中安装bottle框架:

(virtualpython) damao@damao:~/Desktop/virtualpython$ pip install bottle

Collecting bottle
  Downloading bottle-0.12.9.tar.gz (69kB)
    100% |████████████████████████████████| 71kB 100kB/s
Building wheels for collected packages: bottle
  Running setup.py bdist_wheel for bottle ... done
  Stored in directory: /home/damao/.cache/pip/wheels/6e/87/89/f7ddd6721f4a208d44f2dac02f281b2403a314dd735d2b0e61
Successfully built bottle
Installing collected packages: bottle
Successfully installed bottle-0.12.9


## 进入虚拟环境的bin目录可以查看刚安装的bottle框架


(virtualpython) damao@damao:~/Desktop/virtualpython/bin$ ls

activate       activate_this.py  easy_install      pip2    python2        wheel
activate.csh   bottle.py         easy_install-2.7  pip2.7  python2.7
activate.fish  bottle.pyc        pip               python  python-config
退出虚拟环境:deactivate

以树形结构图显示目录
安装命令:sudo apt-get install tree

pony@pony-PC:~/Desktop/projects/skeleton$ sudo apt-get install tree
[sudo] pony 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列软件包是自动安装的并且现在不需要了:
  gir1.2-appindicator3-0.1 libappindicator3-1 libdbusmenu-gtk3-4
  libfile-copy-recursive-perl libidn11:i386 libindicator3-7
  libjsoncpp1 libmuparser2v5 librecad-data liburcu4
  linux-headers-4.9.0-deepin11-amd64
  linux-headers-4.9.0-deepin11-common
  linux-headers-4.9.0-deepin9-amd64
  linux-headers-4.9.0-deepin9-common
  linux-image-4.9.0-deepin11-amd64
  linux-image-4.9.0-deepin9-amd64-unsigned putty-tools
  python-appindicator python-gconf python-pexpect python-ptyprocess
  python-support update-inetd
使用'sudo apt autoremove'来卸载它(它们)。
下列【新】软件包将被安装:
  tree
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 46.1 kB 的归档。
解压缩后会消耗 106 kB 的额外空间。
获取:1 http://packages.deepin.com/deepin panda/main amd64 tree amd64 1.7.0-5 [46.1 kB]
已下载 46.1 kB,耗时 8秒 (5,688 B/s)                                
正在选中未选择的软件包 tree。
(正在读取数据库 ... 系统当前共安装有 251389 个文件和目录。)
正准备解包 .../tree_1.7.0-5_amd64.deb  ...
正在解包 tree (1.7.0-5) ...
正在设置 tree (1.7.0-5) ...
正在处理用于 man-db (2.7.6.1-2) 的触发器 ...

输入命令即可以树形结构显示该目录下的所有文件夹和文件

pony@pony-PC:~/Desktop/projects/skeleton$ tree
.
├── bin
├── CCC.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── dist
│   ├── CCC-0.1.tar.gz
│   └── projectname-0.1.tar.gz
├── docs
├── NAME
│   ├── __init__.py
│   └── __init__.pyc
├── projectname.egg-info
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── setup.py
└── tests
    ├── CCC_tests.py
    ├── CCC_tests.pyc
    ├── __init__.py
    └── __init__.pyc

7 directories, 19 files

另外一种显示树形结构的方法
命令:ls -R

pony@pony-PC:~/Desktop/projects/skeleton$ ls -R
.:
bin           dist  NAME                  setup.py
CCC.egg-info  docs  projectname.egg-info  tests

./bin:

./CCC.egg-info:
dependency_links.txt  requires.txt  top_level.txt
PKG-INFO              SOURCES.txt

./dist:
CCC-0.1.tar.gz  projectname-0.1.tar.gz

./docs:

./NAME:
__init__.py  __init__.pyc

./projectname.egg-info:
dependency_links.txt  requires.txt  top_level.txt
PKG-INFO              SOURCES.txt

./tests:
CCC_tests.py  CCC_tests.pyc  __init__.py  __init__.pyc

测试配置

pony@pony-PC:~/Desktop/projects/skeleton$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.005s

OK

安装你的模块
命令:python setup.py install
编辑好自己的模块以后就可以使用上面的命令安装你自己的模块。

你可能感兴趣的:(笔记)