如何为我用于多个不同项目的模块创建本地 Python 包
How to create a local Python package for modules that I use for several different projects
我写了几套实用函数来分析科学数据。例如,为了制作绘图,我可能有一个名为 plotting_tools.py
的文件
对于几个不同主目录和虚拟环境中的几个不同项目,我可能想使用 plotting_tools.py
中的函数,一种方法是在每个项目目录中都有一个 plotting_tools.py
的副本, 然后 运行
from plotting_tools.py import *
在我的工作流程的顶部(例如,在 Jupyter 笔记本中)。
但是,这种方法有局限性,因为当我在 plotting_tools.py
中发现错误时,我必须手动更新每个本地副本。另一种选择是在我的计算机上有一个目录,我使用 importlib
从中导入模块
from importlib.machinery import SourceFileLoader
foo = SourceFileLoader("plotting_tools","/Users/me/plotting_tools.py").load_module()
from plotting_tools.py import *
这有点脆弱,因为它有一个硬编码的目录,并且像 autoreload()
这样的工具会中断。
我很好奇是否有一种方法可以更优雅地处理这个问题,我有一个本地目录,其中包含我所有的实用程序函数文件,可以将其视为一个包(例如,当我制作一个新的项目和虚拟环境我可以只安装当前版本的 plotting_tools
到那个环境,然后如果主版本发生变化则手动更新它)。最好的方法是对我的所有函数使用 GitHub 存储库,还是有一种方法可以完全在本地执行此操作?
您可以使用 distutils 创建本地库。
您可以创建一个 setup.py 并在那里定义您的库结构。
那么你可以做
python setup.py install
它会使用您定义的包结构将库安装到您的系统或 virtualenv,然后您可以从该包导入您的其他项目。
这与
类似
pip install package
但这将是本地的。
这里是你可以定义的setup.py的例子。
假设您已将实用程序项目定义为 utils
from distutils.core import setup
from utils.version import __version__
setup(
name='utils',
version=__version__,
description='utility library',
author='Asav Patel',
author_email='',
requires=['tornado',
'sqlalchemy', ],
py_modules=['config'],
install_requires=[ 'psutil'
],
packages=['utils',
'polotting_lib', 'polotting_lib.graph', 'polotting_lib.maps',
'other_packages'],
package_data={
'polotting_lib': ['*'],
},
)
那就做吧
python setup.py install
在此之后,您可以在其他脚本中执行此操作。
from polotting_lib import *
def foo(*args):
some_method_from_plotting_lib(args)
希望这对您有所帮助。
我写了几套实用函数来分析科学数据。例如,为了制作绘图,我可能有一个名为 plotting_tools.py
对于几个不同主目录和虚拟环境中的几个不同项目,我可能想使用 plotting_tools.py
中的函数,一种方法是在每个项目目录中都有一个 plotting_tools.py
的副本, 然后 运行
from plotting_tools.py import *
在我的工作流程的顶部(例如,在 Jupyter 笔记本中)。
但是,这种方法有局限性,因为当我在 plotting_tools.py
中发现错误时,我必须手动更新每个本地副本。另一种选择是在我的计算机上有一个目录,我使用 importlib
from importlib.machinery import SourceFileLoader
foo = SourceFileLoader("plotting_tools","/Users/me/plotting_tools.py").load_module()
from plotting_tools.py import *
这有点脆弱,因为它有一个硬编码的目录,并且像 autoreload()
这样的工具会中断。
我很好奇是否有一种方法可以更优雅地处理这个问题,我有一个本地目录,其中包含我所有的实用程序函数文件,可以将其视为一个包(例如,当我制作一个新的项目和虚拟环境我可以只安装当前版本的 plotting_tools
到那个环境,然后如果主版本发生变化则手动更新它)。最好的方法是对我的所有函数使用 GitHub 存储库,还是有一种方法可以完全在本地执行此操作?
您可以使用 distutils 创建本地库。
您可以创建一个 setup.py 并在那里定义您的库结构。 那么你可以做
python setup.py install
它会使用您定义的包结构将库安装到您的系统或 virtualenv,然后您可以从该包导入您的其他项目。 这与
类似pip install package
但这将是本地的。
这里是你可以定义的setup.py的例子。
假设您已将实用程序项目定义为 utils
from distutils.core import setup
from utils.version import __version__
setup(
name='utils',
version=__version__,
description='utility library',
author='Asav Patel',
author_email='',
requires=['tornado',
'sqlalchemy', ],
py_modules=['config'],
install_requires=[ 'psutil'
],
packages=['utils',
'polotting_lib', 'polotting_lib.graph', 'polotting_lib.maps',
'other_packages'],
package_data={
'polotting_lib': ['*'],
},
)
那就做吧
python setup.py install
在此之后,您可以在其他脚本中执行此操作。
from polotting_lib import *
def foo(*args):
some_method_from_plotting_lib(args)
希望这对您有所帮助。