Я думаю, что отследил это. Возможно, это ошибка в trickle
, возникшая в результате ползучего фичуризма в библиотечном вызове socket()
.
Код trickle
переопределяет socket()
, как вы знаете. В верхней части его переопределения в файле trickle-overload.c
есть проверка, включающая type == SOCK_STREAM
, так что только соединения типа SOCK_STREAM
имеют право на обработку.
Код ruby
открывает сокет с type = SOCK_STREAM | SOCK_CLOEXEC
. SOCK_CLOEXEC
- это расширение Linux (начиная с версии 2.6.27), которое позволяет избежать использования последующего вызова fcntl
для установки флага close-on-exec.
К сожалению, SOCK_STREAM
- это не то же самое, что SOCK_STREAM | SOCK_CLOEXEC
, поэтому обработка trickle
не будет происходить, пока его код не будет исправлен, чтобы разрешить расширения, которые теперь разрешены в поле socket
type
.
Я не знаю никакого обходного пути, кроме как перекомпилировать trickle
для вашей системы с измененным сравнением типов сокетов.
(Я отправил сообщение об ошибке в Debian Bugs, поскольку это моя предпочтительная платформа.)
.
Для этого я использую BeautifulSoup
Если вы устанавливаете с помощью pip, следуйте следующей инструкции
pip install bs4
Вы можете проверить это в интерактивной оболочке Python
>>> from bs4 import BeautifulSoup as Soup
>>> content = """<user>
... <login>pelech</login>
... <password>passwords are saved outside</password>
... </user>"""
>>> soup = Soup(content, "html.parser")
>>> soup.find_all("login")
[<login>pelech</login>]
>>> soup.find("login").text
'pelech'
Я использую html.parser по умолчанию. Если у вас есть трудности с его правильным разбором, вы можете вместо этого использовать lxml.
Для полноты картины вы можете просто просмотреть список, возвращенный изsoup.find_all("login")
>>> for login in soup.find_all("login"):
... print(login.text)
...
pelech
Как вариант, питонический способ
>>> usernames = [login.text for login in soup.find_all("login")]
>>> usernames
['pelech']
Для получения дополнительной информации см. https://www.crummy.com/software/BeautifulSoup/bs4/doc/
.Если вы используете ОС Linux -простоеxmlstarletрешение:
xmlstarlet sel -t -v "//user/login" -n users.xml
Я могу только предположить, что ваш XML отформатирован аналогично
<users>
<user>
<login>pelech 1</login>
<password>passwords are saved outside</password>
</user>
<user>
<login>pelech 2</login>
<password>passwords are saved outside</password>
</user>
Сначала вам нужно найти свой тег входа в систему, а затем вам нужно захватить текст этого тега, когда он повторяется внутри вашего цикла.
import xml.etree.ElementTree as ET
tree = ET.parse("users.xml")
root = tree.getroot()
for app in root.findall('user'):
for l in app.findall('login'):
print("%s" % (l.text));
Используя этот XML в качестве примера, у меня это работает нормально.
Если ваш файл гарантированно будет в этом формате с логином внутри тегов в отдельной строке, вам не нужны библиотеки xml и можно сделать простой
sed -n 's_ *</*login>__gp' your.xml
Это удалит теги и начальные пробелы из этой строки и напечатает оставшееся (имя пользователя! ), а все остальные строки подавляются опцией -n
.
использовать модуль lxml
<user>
<login>pelech</login>
<password>passwords are saved outside</password>
</user>
Следующий код извлечет pelech из xml
from lxml import etree
document = etree.parse(open("users.xml"))
user = etree.xpath("//login")[0].text #user will have value pelech