如何在Python中创建和加载egg文件?

时间:2017-11-14 13:08:28

标签: python setuptools egg

我正在研究将python模块作为单个egg文件分发的方法。假设我有一个名为my_module的python模块,我想编写一个python脚本,为我的模块生成一个egg文件。所以我找到了setuptools

from setuptools import setup

setup(
    name="my_module",
    packages=[my_package],
    version="1.0",
)

我对这些问题有一些不利之处:

  1. 此脚本应以python setup.py install运行。换句话说,我需要指定命令行参数。相反,我想在我的python代码中自动生成我的egg文件,它有自己对命令行参数的控制。
  2. 结果文件被输出到setup的文件目录中。我想控制脚本中的输出目录路径。
  3. 脚本创建我实际上不需要的builddist个文件夹。也许,我可以在调用setup后删除文件夹来解决这个问题。
  4. 我应该如何使用setuptools来解决上述问题?

    还有我如何从给定的egg文件中加载我的模块?

    假设我有以下模块:

    # my_module.py
    
    class MyClass:
        def __init__(self):
            self._x = None
    
        def set_x(self, x):
            self._x = x
    
        def get_x(self):
            return self._x
    

    我写了这个脚本来创建一个egg文件:

    # create_egg.py
    
    from setuptools import setup
    
    setup(
        name="my_module",
        packages=['my_module'],
        version="1.0",
    )
    

    当我运行creage_egg.py

    时,我收到了这样的错误
    $ python3 create_egg.py
    usage: create_egg.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: create_egg.py --help [cmd1 cmd2 ...]
       or: create_egg.py --help-commands
       or: create_egg.py cmd --help
    
    error: no commands supplied
    

1 个答案:

答案 0 :(得分:1)

我发现的第一件事是包必须是一个目录。因此,保持这种结构是必要的:

my_project/
    my_module/
        __init__.py
    output/
    create_egg.py
test_egg.py

为了省略指定命令行参数的必要性,有一个特殊选项script_args。我在这里找到了它:http://peak.telecommunity.com/DevCenter/setuptools

我的__init__.py

class MyClass:
    def __init__(self):
        self._x = None

    def set_x(self, x):
        self._x = x

    def get_x(self):
        return self._x

我的create_egg.py

import os
import shutil
from setuptools import setup


OUTPUT_DIR = 'output'


if __name__ == "__main__":
    setup(
        name="my_module",
        packages=['my_module'],
        version="1.0",
        script_args=['--quiet', 'bdist_egg'], # to create egg-file only
    )

    egg_name = os.listdir('dist')[0]

    os.rename(
        os.path.join('dist', egg_name),
        os.path.join(OUTPUT_DIR, egg_name)
    )

    shutil.rmtree('build')
    shutil.rmtree('dist')
    shutil.rmtree('my_module.egg-info')

我的test_egg.py

import sys
sys.path.append('my_project/output/my_module-1.0-py3.5.egg')

import my_module


obj = my_module.MyClass()
obj.set_x(29)
print(obj.get_x())

创建egg-file:

~/Stuff/my_project $ python3 create_egg.py 
zip_safe flag not set; analyzing archive contents...

测试模块:

~/Stuff $ python3 test_egg.py 
29