问题描述
我编写了几组实用函数来分析科学数据。
例如,为了制作绘图,我可能有一个名为plotting_tools.py
的文件
对于几个不同主目录和虚拟环境中的几个不同项目,我可能想使用plotting_tools.py
函数 一种方法是在每个项目目录中都有一个plotting_tools.py
的副本,然后运行
from plotting_tools.py import *
在我的工作流程的顶部(例如,在 Jupyter 笔记本中)。
然而,这种方法有一定的局限性,因为当我在发现一个bug 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 存储库用于我的所有功能,还是有办法完全在本地执行此操作?
1楼
您可以使用创建本地库。
您可以创建一个 setup.py 并在那里定义您的库结构。 那么你可以做
python setup.py 安装
它将使用您定义的包结构将库安装到您的系统或 virtualenv,然后您可以从其他项目中的该包导入。 这类似于做
pip安装包
但这将是本地的。
这是您可以定义的 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 安装
在此之后,您可以在其他脚本中执行此操作。
from polotting_lib import *
def foo(*args):
some_method_from_plotting_lib(args)
希望这可以帮助。