Как вызвать порядок разрушения статических объектов в другом dlls?

Вы правы в том, что некоторые предметы отсутствуют, и вы не можете проверить это для позиции или селектора в одиночку во всех случаях, например, Стиль. Вы можете проверить наличие стиля в тексте контейнера. Кто-то с большим знанием Python, вероятно, мог бы привести это в нечто более питонское и эффективное значение

import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
pattern = re.compile(r'Style:')
url = 'https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010?_pgn=1'
res = requests.get(url)
soup = bs(res.content, 'lxml')
results = []
for item in soup.select('.s-item'):
    x = item.select_one('.s-item__title')
    title = x.text if x else None
    x = item.select_one('.s-item__price')
    price = x.text if x else None
    x = item.select_one('.s-item__shipping')
    shipping = x.text if x else None
    x = item.find('span', text=pattern)
    style = x.text.replace('Style: ','') if x else None
    results.append([title, price, shipping, style])

df = pd.DataFrame(results)
print(df)
5
задан Igor Oks 16 May 2009 в 10:28
поделиться

4 ответа

Глобальные объекты уничтожаются, когда их соответствующая DLL выгружается. Так как ваша dll 'User', вероятно, зависит от вашей dll 'Resource', у вас проблемы: 'resource' всегда будет уничтожен раньше 'user'.

Меня также интересует хороший ответ на этот вопрос, если таковой существует. До сих пор я использую функцию очистки, которая должна вызываться приложением перед его завершением, и я сохраняю только безопасный код в деструкторах.

3
ответ дан 14 December 2019 в 04:47
поделиться

If you are able to put that 2 global variables in the same DLL it's not the same story. As told by Jem in its own reply, DLL detachement order is not guaranteed by the system. Therefore you may have a big problem when having 2 separated Dlls. I am not a Windows system guru, but having a look with google, I found msdn bloggers who tells they had the same issue with no good solution to address it.

I you are able to put them in one same DLL, according to me the solution is easier, in that case you don't need to address the "not garanteed DLL detachement order" issue (unsolvable as far as I understand).
But then you still need to address a new issue: global variable destruction order is not garanteed by the c++ language. But this one can be addressed:

you need to use some kind of reference couting. a boost::shared_ptr may do the trick.

Declare it global and define it that way:

boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!

Then you need to modify your User implementation to store its own shared_ptr:

class User
{
    ...
    boost::share_ptr a_resource_ptr;
    ...
};

As long as all one of your User instance is not destroyed, those will 'retain' the Resource instance, and so prevent it from being prematuraly deleted, even though the global shared_ptr could have been destroyed.
The last User instance being destroyed will (undirectly) delete the Resource instance.

Whatever the reference counting you use, ComPtr, your own, it should do the trick.

3
ответ дан 14 December 2019 в 04:47
поделиться

I don't think you can change order of destruction of globals that are in different modules. Any chance of adding some reference counting?

1
ответ дан 14 December 2019 в 04:47
поделиться

В случае, если вы действительно хотите получить 2 отдельные библиотеки DLL, у меня может быть несколько советов для вас: вы можете рассмотреть возможность использования FreeLibrary () из Windows API. Как указано в msdn FreeLibrary () уменьшает счетчик ссылок для Dll, который выгружается, когда счетчик достигает 0.

Недостаток: использование FreeLibrary () подразумевает, что вы являетесь загрузка его с помощью LoadLibrary () ( ссылка на msdn ) и вызов функции из этой библиотеки подразумевает, что вы используете функцию GetProcAddress () , что может привести к очень неприятным код. И это также может означать некоторые изменения в вашем коде - например, получение глобальной переменной, указывающей на функции Dll, чтобы сохранить адрес каждой функции ...

Если вы хотите реализовать это:

  1. вы должны загрузить & освободите библиотеку из функции main () вашего процесса,
  2. , а также загрузите и освободите библиотеку из Dll, реализующей класс User. Реализуйте его в функции DllMain () для этой Dll, когда причина - DLL_PROCESS_DETACH (см. ссылку на DllMain mdsn .

Таким образом будет выгружен файл " Библиотека ресурсов "только после того, как библиотека" Пользователь "закончит с ней.

Попробуйте, если хотите, и позвольте мне сказать, работает ли она, поскольку я ее никогда не реализовывал ..

Ps: Я отправил второй ответ на ваш вопрос, чтобы получить значимое разделение между двумя ответами, поскольку я (пытаюсь) детализировать их оба. Я не хочу, чтобы вы перепутали их и запутались ...

  • , а также загрузить и освободить библиотеку из Dll, реализующей класс User. Реализуйте его в функции DllMain () для этой Dll, когда причина - DLL_PROCESS_DETACH (см. ссылку на DllMain mdsn .
  • Таким образом будет выгружен файл " Библиотека ресурсов "только после того, как библиотека" Пользователь "закончит с ней.

    Попробуйте, если хотите, и позвольте мне сказать, работает ли она, поскольку я ее никогда не реализовывал ..

    Ps: Я отправил второй ответ на ваш вопрос, чтобы получить значимое разделение между двумя ответами, поскольку я (пытаюсь) детализировать их оба. Я не хочу, чтобы вы перепутали их и запутались ...

  • , а также загрузить и освободить библиотеку из Dll, реализующей класс User. Реализуйте его в функции DllMain () для этой Dll, когда причина - DLL_PROCESS_DETACH (см. ссылку на DllMain mdsn .
  • Таким образом будет выгружен файл " Библиотека ресурсов "только после того, как библиотека" Пользователь "закончит с ней.

    Попробуйте, если хотите, и позвольте мне сказать, работает ли она, поскольку я ее никогда не реализовывал ..

    Ps: Я отправил второй ответ на ваш вопрос, чтобы получить значимое разделение между двумя ответами, поскольку я (пытаюсь) детализировать их оба. Я не хочу, чтобы вы перепутали их и запутались ...

    s Ссылка DllMain .

    Таким образом, библиотека «Ресурс» будет выгружена только после того, как библиотека «Пользователь» закончит с ней.

    Попробуйте, если хотите, и позвольте мне сказать, работает ли это, поскольку я никогда не реализовывал его ..

    Ps: Я отправил второй ответ на ваш вопрос, чтобы получить значимое разделение между двумя ответами, поскольку я (попробуйте чтобы) детализировать их обоих. Я не хочу, чтобы вы их перепутали и запутали ...

    s Ссылка DllMain .

    Таким образом, библиотека «Ресурс» будет выгружена только после того, как библиотека «Пользователь» закончит с ней.

    Попробуйте, если хотите, и позвольте мне сказать, работает ли это, поскольку я никогда не реализовывал его ..

    Ps: Я отправил второй ответ на ваш вопрос, чтобы получить значимое разделение между двумя ответами, поскольку я (попробуйте чтобы) детализировать их обоих. Я не хочу, чтобы вы их перепутали и запутали ...

    1
    ответ дан 14 December 2019 в 04:47
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: