我有几套实用功能,我用它来分析科学数据。例如,为了制作图表,我可能会有一个名为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存储库,还是有办法在本地完成这个?
答案 0 :(得分:2)
您可以使用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)
希望这会有所帮助。