0. 简介

在使用python程序包时。我们最常遇到的就是使用sudo apt-get install或者pip install的方式来完成python包的安装。但是有些时候我们需要对函数包进行改动,这时候很多人就会选择使用源码进行安装。一般会找到setup.py文件并完成:

python setup.py build
python setup.py install

但是编者在尝试安装时发现有些库只提供了pip安装,同时我们也没有setup.py文件来使用。这时我们可以先通过pip完成安装然后去安装的路径下替换文件即可,下面我们将详细说明。

1. dist-packages和site-packages

dist-packages和site-packages本质上没有很大的区别主要的还是编译的方式的不同。

  1. sudo apt-get install 安装的package存放在/usr/lib/python3.8/dist-packages目录中
  2. pip 或者 easy_install安装的package存放在/usr/local/lib/python3.8/dist-packages目录中
  3. 手动从源代码安装的package存放在/usr/local/lib/python3.8/site-packages 目录中
  4. 手动从源代码或者pip install —user安装的package存放在./local/lib/python3.8/site-packages目录中

一般来说,自己手动安装的python包的优先级比系统安装的优先级高,这就意味着如果一个包安装了而不同版本,那么优先手动安装的版本。如果从源码安装包,那么安装的位置也要选择./local/lib/python3.8/site-packages中便于包的管理。当然你也可以安装到你喜欢的位置,但是要把包的路径添加到python的库搜索路径中,方法会在下面提到。

我们在编译时候可以发现安装成功的代码都在/usr/local/lib/python3.8/dist-packages/中。然后可以找到对应的安装的包,然后就可以将对应的包替换掉即可,这样省去了自己编写setup.py的步骤,属于另一种即插即用的方式。

3. 通过sys.path导入包

当我们想利用的包在工程的其他目录时,我们需要将该路径添加到系统的搜索路径中,有两种方式:
第一种方式是将包的绝对路径添加到系统的搜索路径中,只需调用sys.path.insert(pos,dir)或者sys.path.append(dir),这种方式添加是硬链接到你的代码,只在程序运行时有效,但是这种方式在代码部署时需要手工改动代码中的所有路径,不推荐这种方式。

第二种方式就是将该路径添加到python的默认搜索路径中,有两种方式可以实现。

  • 在系统变量PYTHONPATH中添加该路径
  • .local/lib/pyhon2.7/site-packages/下的.pth下添加该目录

我们推荐第二种方式,因为这样在代码部署时我们只需要改动路径的配置文件即可。

4. python代码加密之pyc

  1. 对于py文件,可以执行下面命令来生成pyc文件
python -m foo.py
  1. 另外一种方式是通过python代码来生成pyc文件。
import py_compile
py_compile.compile('/path/to/foo.py')
  1. python批量生成pyc文件。python提供了一个模块叫compileall:
import compileall
compileall.compile_dir(r'/path')

5. 包的分发

如果你想将包封装可以尝试:

projectname/
    README.txt
    Doc/
        documentation.txt
    projectname/
        __init__.py
        foo.py
        bar.py
        utils/
            __init__.py
            spam.py
            grok.py
    examples/
        helloworld.py
        ...

首先你要编写一个setup.py,类似下面这样:

# setup.py
# setup.py

import os
from setuptools import setup, find_packages

__version__ = '1.0' # 版本号
requirements = open('requirements.txt').readlines() # 依赖文件

setup(
    name = 'projectname', # 在pip中显示的项目名称
    version = __version__,
    author = 'Dechin',
    author_email = 'dechin.phy@gmail.com',
    url = '',
    description = 'ts: Test Setup',
    packages = find_packages(exclude=["projectname", 'projectname.utils']), # 项目中需要拷贝到指定路径的文件夹
    python_requires = '>=3.5.0',
    install_requires = requirements # 安装依赖
        )
)

创建一个MANIFEST.in文件,列出所有在你的包中需要包含进来的非源码文件:

# MANIFEST.in
include *.txt
recursive-include examples *
recursive-include Doc *

确保setup.pyMANIFEST.in文件放在你的包的最顶级目录中。一旦你已经做了这些,你就可以像下面这样执行命令来创建一个源码分发包了:

python setup.py sdist

它会创建一个文件比如projectname-1.0.zip或projectname-1.0.tar.gz,具体依赖于你的系统平台。如果一切正常,这个文件就可以发送给别人使用或者上传至Python Package Index.

6. 参考链接

https://hpzhao.github.io/2016/07/24/Python%E6%A8%A1%E5%9D%97%E4%B8%8E%E5%8C%85/

https://blog.csdn.net/cc1949/article/details/78286224

https://www.cnblogs.com/dechinphy/p/setup.html