我需要运送使用多个存储在本地Library目录中的软件包的Python程序集合:目标是避免用户在使用我的程序之前安装软件包(这些软件包位于Library目录中).导入库中包含的软件包的最佳方法是什么?
我尝试了三种方法,但它们都不是完美的:有没有更简单,更可靠的方法?还是这些方法中最好的一种?
>在第一种方法中,只需将Library文件夹添加到库路径:
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))
import package_from_Library
Library文件夹放在开头,以便程序附带的软件包优先于用户安装的相同模块(通过这种方式,我确定它们具有与我的程序一起使用的正确版本).当“库”文件夹不在当前目录中时,此方法也适用.但是,这种方法有缺点.我的每个程序都向sys.path添加了相同路径的副本,这很浪费.此外,所有程序都必须包含相同的三条路径修改行,这违反了“不要自己重复”的原则.
>对上述问题的改进在于,通过在导入的模块中添加库路径,尝试仅添加一次:
# In module add_Library_path:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'Library'))
然后在我的每个程序中使用:
import add_Library_path
import package_from_Library
这样,借助CPython的缓存机制,模块add_Library_path仅运行一次,并且库路径仅添加一次到sys.path.但是,此方法的缺点是import add_Library_path具有不可见的副作用,并且导入的顺序很重要:这使代码更不清晰,更脆弱.另外,这迫使我分发程序以包含用户不会使用的add_Library_path.py程序.
>也可以通过将库中的Python模块打包成一个包(存储在其中的空__init__.py文件)来导入它,该包可以执行以下操作:
from Library import module_from_Library
但是,这会破坏Library中的程序包,因为它们可能会执行xlutils.filter import…之类的操作,这会因为在sys.path中找不到xlutils而中断.因此,此方法有效,但仅当在Library中包括模块而不在包中包括模块时才有效.
所有这些方法都有一些缺点.
有没有更好的方法来传送带有存储在本地Library目录中的程序包集合的程序?还是上述方法之一(方法1?)是最好的?
PS:就我而言,Library中的所有软件包都是纯Python软件包,但是适用于任何操作系统的更通用的解决方案是最好的.
PPS:目标是使用户能够使用我的程序而无需安装任何程序(除了复制我定期发送的目录之外),如上面的示例中所示.
PPPS:更准确地说,目标是要具有灵活性,使用户对包含我的程序和“隐藏”的“库”文件夹的目录进行简单的复制,从而轻松地从“库”更新我的程序集及其相关的第三方软件包. ”第三方软件包. (我经常进行更新,因此我不想强迫用户也更新他们的Python发行版.)