包含一个目录到setuptools安装中。

3
我制作了一个基于插件的程序,可以从不同的目录加载插件,其中一个目录是模块所在的目录(为了方便在源代码库中测试运行)。
我希望当前在源代码库中的插件能够被安装到模块中,以便在任何安装上默认加载。 这最好存储在setup()创建的egg中。
目前,源代码库的重要部分如下:
/path/to/repo/
    plugins/
        example.py
    myprog.py # the module
    myprog    # the script
    setup.py

setup.py 大致长这样:

from setuptools import setup

setup(
    name = 'myprog',
    version = '1.0',
    scripts = ['myprog'],
    py_modules = ['myprog'],

    package_data = {
        '': ['plugins/']
    }
)

然而,plugins目录并没有在任何安装方式中包含。
我该如何包含它,以便于这一行:
os.path.join(os.path.dirname(os.path.realpath(__file__)), 'plugins')

在运行 python3 setup.py install 后,它将能够正确地找到该目录吗?


请将此路径 sys.path.append(os.getcwd()+'/plugins') 添加到 myprog.py 中,或者在哪里可以调用? - dsgdfg
不要定义静态路径! - dsgdfg
添加静态路径不能解决问题。我想要一个文件被包含在安装中。改变程序查找其原始位置不是一个有效的解决方案。 - 2mac
1个回答

2

如果您创建一个全局的plugins模块,所有人都可以导入它,或者每个人都会因为错误而导入它,那么您的设置将会破坏一些东西。不要这样做。相反,请按照以下步骤操作:

  • 将您的myprog.py文件转换为包。最简单的方法是:mkdir myprog; mv myprog.py myprog/__init__.py
  • 然后,您可以将插件移动到子包中。touch plugins/__init__.py; mv plugins myprog/
  • 使用子包时,您根本不需要使用包数据。
  • 要访问您的插件,只需执行import myprog.plugins.foo,其中foo.py是插件的名称。
  • 此外:不要触摸__file__,请改用pkg_resources
  • 额外加分:使用入口点来运行您的脚本。

如果该目录中的文件不一定是源文件,例如语言包或图像文件,怎么办?我如何保证该目录将被包含,并且模块在安装后能够使用相对路径查看这些文件? - 2mac
@2mac: 在那个时候,你可以使用package_data={'myprog': ['plugins/*'}。确保将文件添加到MANIFEST.in(谷歌搜索该名称)。我认为include_package_data也可能有效。(另外,你需要用packages = ['myprog', 'myprog.plugins']替换py_modules = ['myprog']或使用setuptools的find_packages()函数。 - Chris Warrick
这些会被包含在安装中吗?根据文档,package_dataMANIFEST.in 只声明了要包含在源分发中的内容。这些需要与模块一起安装,以便作为数据文件访问。 - 2mac
@2mac:MANIFEST.in声明源分发中的文件,package_data安装它们。 - Chris Warrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接