我可以在 python setup.cfg 中使用通配符吗?

4 投票
2 回答
1549 浏览
提问于 2025-04-18 16:32

我有一个 setup.cfg 的配置脚本,在里面我列出了一堆要安装的本地文件,比如像下面这样:

[files]
packages = tests
           utils

scripts = utils/Communication.ComModule.dll
    utils/Communication.DeployerLib.Controls.dll
    utils/Communication.DeployerLib.dll
    utils/Communication.RModule.Data.dll
    utils/Communication.RModule.dll
    utils/Communication.Serial.dll
    utils/Components.dll
    utils/Converters.dll
    utils/Data.dll
    utils/Log.dll
    utils/Log.Log4Net.dll
    ....

那么,我能不能用一个通配符来一次性安装所有的 dll 文件呢?这样做可以吗?我能不能直接用类似下面的方式(来安装所有的 dll 和所有的 exe)?

[files]
packages = tests
           utils

scripts = utils/*.dll
    utils/*.exe

2 个回答

1

你可以通过添加 glob 模块来实现。举个例子:

import glob

wildcard_path = "/some/directory/*.dll"

file_list = glob.glob(wildcard_path)

现在,变量 file_list 将会是一个包含所有 /some/directory 目录下 *.dll 文件的列表。所以在配置文件中输入你的通配符路径,然后用 glob 来获取实际的文件名。

不过要注意,在配置文件中输入路径时要小心。我建议使用绝对路径,这样无论你从哪个地方运行脚本,结果都是一致的。如果你传递一个相对路径给 glob,它会从当前工作目录去查找那个路径。

2

不,目前似乎在 scripts 这个部分不支持通配符或类似 find: 的指令(详细信息可以查看 这个链接)。所以我觉得唯一的选择就是列出所有的脚本,或者回到使用 setup.py

不过,既然你想要把包里的 .dll 文件一起打包,以下几种替代方案可能值得考虑:

[options]
packages = utils
zip_safe = False

[options.package_data]
* = *.dll
    *.exe

或者

[options]
include_package_data = True
zip_safe = False

(后者需要有一个 MANIFEST.in 文件,里面包含要包含的文件模式)。详细信息可以查看 这个链接。如果你之后需要在你的 utils Python 模块中找到以这种方式安装的 .dll 文件,可以使用类似下面的代码:

from pathlib import Path
package_path = Path(__file__).parent
dll_name = str(package_path / "Communication.Serial.dll")

或者,对于较新的 Python 版本,可以使用 importlib 提供的功能。

撰写回答