• python使用的一些小技巧


    0. 简介

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

    python setup.py build
    python setup.py install
    
    • 1
    • 2

    但是编者在尝试安装时发现有些库只提供了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
    1. 另外一种方式是通过python代码来生成pyc文件。
    import py_compile
    py_compile.compile('/path/to/foo.py')
    
    • 1
    • 2
    1. python批量生成pyc文件。python提供了一个模块叫compileall:
    import compileall
    compileall.compile_dir(r'/path')
    
    • 1
    • 2

    5. 包的分发

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

    projectname/
        README.txt
        Doc/
            documentation.txt
        projectname/
            __init__.py
            foo.py
            bar.py
            utils/
                __init__.py
                spam.py
                grok.py
        examples/
            helloworld.py
            ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    首先你要编写一个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 # 安装依赖
            )
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    # MANIFEST.in
    include *.txt
    recursive-include examples *
    recursive-include Doc *
    
    • 1
    • 2
    • 3
    • 4

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

    python setup.py sdist
    
    • 1

    它会创建一个文件比如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

  • 相关阅读:
    java设计模式(六)——原型模式
    # 02 初识Verilog HDL
    Azure DevOps和Jira比较
    基于 C# 实现样式与数据分离的打印方案
    8月初整理,Adobe 2022全家桶更新情况(Mac+win)限时分享
    【PAT(甲级)】1043 Is It a Binary Search Tree
    MYSQL正则表达式函数详解和实战
    计算机毕业设计(附源码)python在线学习交流平台
    Java常用的设计模式
    [Java学习笔记] Java异常机制(也许是全网最独特视角)
  • 原文地址:https://blog.csdn.net/lovely_yoshino/article/details/125389370