簡體   English   中英

在python中解析pip list / pip凍結的輸出

[英]Parse output of pip list / pip freeze in python

你好我有這樣的字符串:

AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)

我想將其拆分為元組列表。 這樣每個列表項都有一個包含兩個值的元組,名稱和版本(沒有括號)。

我只能用換行符分割字符串,但我不知道如何正確地抓住括號中的數字等。有人能解釋我怎么能這樣做嗎?

編輯:我正在嘗試解析pip list local

 def get_installed_modules(self):
    data = subprocess.check_output(["pip", "list", "--local"])
    result = [tuple(line.replace('(', '').replace(')', '').split())
              for line in data.splitlines()]
    print(result)

我有一個項目,我不能拆分字符串,但它需要像對象一樣的字節...

TypeError: a bytes-like object is required, not 'str'

選項1
如果你從pip獲得這些輸出,你可以使用pip.operations.freeze編程方式pip.operations.freeze -

from pip.operations import freeze  

modules = list(
    map(lambda x: x.split('=='), freeze.freeze(local_only=True))
)

print(modules)

[['aiodns', '1.1.1'],
 ['aiohttp', '1.2.0'],
 ['appdirs', '1.4.0'],
 ['appnope', '0.1.0'],
 ['argparse', '1.4.0'],
...

選項2
你也可以使用get_installed_distributions ,取自這里

import pip

modules = []
for i in pip.utils.get_installed_distributions():
    modules.append((i.key, i.version))

print(modules)

[('pytreebank', '0.2.4'),
 ('cssselect', '1.0.1'),
 ('numba', '0.36.0.dev0+92.g2818dc9e2'),
 ('llvmlite', '0.0.0'),
 ('yarl', '0.8.1'),
 ('xlwt', '1.3.0'),
 ('xlrd', '1.1.0'),
 ...
]

選項3
第三種方法是使用pip.main -

import pip
pip.main(['list', 'local'])

但是,這寫入stdout

您還可以使用正則表達式

>>> s = "AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)"
>>> re.findall(r"(.+) \((.+)\)", s)
[('AdvancedHTMLParser', '8.0.1'),
 ('appdirs', '1.4.3'),
 ('beautifulsoup4', '4.6.0'),
 ('chardet', '3.0.4'),
 ('chrome-gnome-shell', '0.0.0'),
 ('cupshelpers', '1.0'),
 ('cycler', '0.10.0'),
 ('Cython', '0.27.3')]

直截了當:

data = 'AdvancedHTMLParser (8.0.1)\nappdirs (1.4.3)\nbeautifulsoup4 (4.6.0)\nchardet (3.0.4)\nchrome-gnome-shell (0.0.0)\ncupshelpers (1.0)\ncycler (0.10.0)\nCython (0.27.3)'
result = [tuple(line.replace('(', '').replace(')', '').split())
          for line in data.splitlines()]

print(result)

輸出:

[('AdvancedHTMLParser', '8.0.1'), ('appdirs', '1.4.3'), ('beautifulsoup4', '4.6.0'), ('chardet', '3.0.4'), ('chrome-gnome-shell', '0.0.0'), ('cupshelpers', '1.0'), ('cycler', '0.10.0'), ('Cython', '0.27.3')]

拆開開口上的每一行並刪除關閉的一行:

self.__all_modules = [tuple(x[:-1].split(" (")) for x in data.splitlines()]

接受的答案不再適用於最新版本的pip(> 10.0)

所有這些方法現在都在私有包中。 例如,凍結模塊位於_internal / operations中 您仍然可以使用它,但我個人認為使用內部包不是一個好主意。 它們可能會在新版本中輕松移動或更改。

你可以做的是繼續使用pip cli版本,使用--format json選項來格式化輸出並在python中解析它。

 import subprocess
 import json
 data = subprocess.check_output(["pip", "list", "--format", "json"])
 parsed_results = json.loads(data)
 [(element["name"], element["version"]) for element in parsed_results]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM