我正在将构建系统中使用的Ruby文件移植到Python。该文件在我们的存储库中的Depends
文件中查找debian/control
行,检查每个依赖项,并apt-get install
未安装的所有内容。我正在尝试重现此功能。
作为将其移植到Python的一部分,我查看了deb_pkg_tools
模块。我pip install
编辑了它并创建了一个简单的脚本install-dep2.py
。
#!/usr/bin/python
import deb_pkg_tools
controlDict = deb_pkg_tools.control.load_control_file('debian/control')
但是,当我运行此脚本时,我收到以下错误:
$ build/bin/install-dep2.py
Traceback (most recent call last):
File "build/bin/install-dep2.py", line 4, in <module>
controlDict = deb_pkg_tools.control.load_control_file('debian/control')
AttributeError: 'module' object has no attribute 'control'
debian/control
文件存在:
$ ls -l debian/control
-rw-rw-r-- 1 stephen stephen 2532 Jul 13 14:28 debian/control
如何处理此debian/control
文件?如果有更好的方法,我不需要使用deb_pkg_tools
。
答案 0 :(得分:2)
你遇到的问题不是Python认为debian/control
不存在,而是看起来deb_pkg_tools.control
似乎不存在。
如果我是你,我会使用Debian的python-debian
包来解析控制文件。下面是解析控制文件以获取依赖关系的代码。它甚至可以用于具有多个二进制包的包。
import deb822
for paragraph in deb822.Deb822.iter_paragraphs(open('debian/control')):
for item in paragraph.items():
if item[0] == 'Depends':
print item[1]
上面示例中的每个项目都是将“键”与“值”对齐的元组,因此item[0]
为我们提供了“键”,item[1]
为我们提供了“值”。< / p>
显然,上面的示例只是打印出控制文件中的依赖项,因此依赖项的格式不适合直接插入apt-get install
。此外,通过解析控制文件,除了实际的包名之外,我还有${python:Depends}
之类的东西,所以这是你必须考虑的事情。以下是我从上例中得到的输出示例:
joseph@crunchbang:~$ python test.py
bittornado,
${python:Depends},
python-psutil,
python-qt4,
python-qt4reactor,
python-twisted,
xdg-utils,
${misc:Depends},
${shlibs:Depends}
我在回答您的问题时发现this bug report和python-debian source code是非常有用的资源。
答案 1 :(得分:2)
您可能希望查看mk-build-deps
(来自devscripts
包),这是一个已经完成您想要实现的标准脚本。
$ mk-build-deps -i -s sudo