如何在 Python 中创建和加载 egg 文件?
How do I create and load an egg-file in Python?
我正在研究一种将 python 模块作为单个 egg 文件分发的方法。假设我有一个名为 my_module
的 python 模块,我想编写一个 python 脚本来为我的模块生成一个 egg 文件。所以我找到了 setuptools
.
from setuptools import setup
setup(
name="my_module",
packages=[my_package],
version="1.0",
)
我在这些问题上有一些缺点:
- 此脚本应 运行 为
python setup.py install
。换句话说,我需要指定命令行参数。相反,我想在我的 python 代码中自动生成我的 egg 文件,它可以自己控制命令行参数。
- 结果文件输出到安装程序的文件目录中。我想在脚本中控制输出目录路径。
- 脚本创建了我实际上不需要的
build
和 dist
文件夹。可能,我可以通过调用 setup
. 后删除文件夹来解决它
我应该如何使用 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
我发现的第一件事是包必须是目录。所以有必要保持这样的结构:
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 文件:
~/Stuff/my_project $ python3 create_egg.py
zip_safe flag not set; analyzing archive contents...
正在测试模块:
~/Stuff $ python3 test_egg.py
29
我正在研究一种将 python 模块作为单个 egg 文件分发的方法。假设我有一个名为 my_module
的 python 模块,我想编写一个 python 脚本来为我的模块生成一个 egg 文件。所以我找到了 setuptools
.
from setuptools import setup
setup(
name="my_module",
packages=[my_package],
version="1.0",
)
我在这些问题上有一些缺点:
- 此脚本应 运行 为
python setup.py install
。换句话说,我需要指定命令行参数。相反,我想在我的 python 代码中自动生成我的 egg 文件,它可以自己控制命令行参数。 - 结果文件输出到安装程序的文件目录中。我想在脚本中控制输出目录路径。
- 脚本创建了我实际上不需要的
build
和dist
文件夹。可能,我可以通过调用setup
. 后删除文件夹来解决它
我应该如何使用 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
我发现的第一件事是包必须是目录。所以有必要保持这样的结构:
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 文件:
~/Stuff/my_project $ python3 create_egg.py
zip_safe flag not set; analyzing archive contents...
正在测试模块:
~/Stuff $ python3 test_egg.py
29