1. 程式人生 > 實用技巧 >python程式碼打包釋出

python程式碼打包釋出

引自:https://blog.csdn.net/qq_16912257/article/details/80160639

python程式碼打包釋出


1.distutilsVSsetuptools

python打包(packaging)常用的兩個工具:distutilssetuptools

  • distutils是標準打包工具,被包含在標準庫中,可以用作簡單的python釋出。

  • setuptools並不是python標準庫的一部分,它的誕生是為了克服distutils的不足,是distutils的增強版。

這裡只介紹distutils的使用

2. distutils基本使用

(1)簡介

當使用distutils時,setup指令碼是構建、釋出、安裝模組的核心。setup指令碼的目的是向distutils描述你的模組釋出,以便於在你的模組上操作的各種命令都能正確進行。setup指令碼主要包含一個setup()函式呼叫,模組開發者提供給distutils的大多數資訊都是通過setup()函式的關鍵字引數傳遞的。

下面是distuitls模組的setup.py檔案示例:

1 from distutils.core import setup
2 
3 setup(name=’Distutils’,
4       version=’1.0’,
5 description=’Python Distribution Utilities’, 6 author=’Greg Ward’, 7 author_email=[email protected]’, 8 url=’http://www.python.org/sigs/distutils-sig/’, 9 packages=[’distutils’, ’distutils.command’],

(2)一個例子

構建如下目錄結構:

test/
├── foobar
│   ├── __init__.py
│   ├── bar.py
│   ├── foo.py
│   └── subfoo
│       ├── __init__.py
│       └── blah.py
└── setup.py

setup.py書寫如下:

1 from distutils.core import setup
2 setup(name='foobar',
3       version='1.0',
4       description='test module',
5       author='brown',
6       packages=['foobar', 'foobar.subfoo'],
7       )

在test目錄一級,執行install命令

python setup.py install

使用pip show檢視剛剛安裝的包

pip show foobar

3. 安裝package data

有時,我們需要將一些資料檔案(資料、配置、日誌等)打包進去,這時需要使用package_data關鍵字

(1)例子

在上面例子test/foobar新增data目錄,並在裡面建立1.dat2.dat檔案,新的目錄結構如下:

test/
├── foobar
│   ├── __init__.py
│   ├── bar.py
│   ├── data
│   │   ├── 1.dat
│   │   └── 2.dat
│   ├── foo.py
│   └── subfoo
│       ├── __init__.py
│       └── blah.py
└── setup.py

更改setup.py為:

1 from distutils.core import setup
2 
3 setup(name='foobar',
4       version='1.0',
5       description='test module',
6       author='brown',
7       packages=['foobar', 'foobar.subfoo'],
8       package_data={'foobar': ['data/*']},
9       )

然後執行python setup.py install安裝。

4. 擴充套件模組

如果你的程式碼裡包含一些C、C++程式碼,就需要做些額外操作,包括:宣告副檔名字、原始檔位置、include目錄或lib目錄。

使用ext_modules關鍵字引數,ext_modulesExtension例項的集合。

Extension引數如下:

Extension(’pkg.foo’, [’src/foo.c’], include_dirs=[’include’], libraries=['lib'])

  • pkg.foo是擴充套件包名,它決定了你在python程式碼中如何引用foo.c
  • src/foo.c是C程式碼相對位置;
  • include是C程式碼依賴的include目錄;
  • lib是C程式碼依賴的庫目錄;

(1)例子

建立如下目錄的檔案:

test/
├── cpp
│   ├── bar.c
│   └── foo.c
├── foobar
│   ├── __init__.py
│   └── test.py
└── setup.py

setup.py檔案如下:

 1 from distutils.core import setup, Extension
 2 
 3 setup(name='foobar',
 4       version='1.0',
 5       description='test module',
 6       author='brown',
 7       packages=['foobar'],
 8       ext_modules=[
 9           Extension('foobar.foo', ['cpp/foo.c']),
10           Extension('foobar.bar', ['cpp/bar.c'])
11           ],
12       )

然後install

Ref

Distributing Python Modules