我可以在 python setup.cfg 中使用通配符吗?
我有一个 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
提供的功能。