Как я препятствую тому, чтобы os.walk Python шел через точки монтирования?

В Player::menu у вас есть петля, for(auto& p : ItemsList). В этом цикле вы вызываете последовательность (useItem(item) -> ItemAttributes(itemID) -> removeItem(id) -> ItemsList.erase(itr)), которая может изменить карту ItemsList, через которую вы перебираете. Это делает недействительными итераторы, в настоящее время ссылающиеся на p, поэтому при попытке получить доступ к следующему элементу на карте вы получите неопределенное поведение, потому что (используемый внутри) итератор больше не действителен.

Одним из возможных способов решения этой проблемы является изменение цикла for для использования собственных итераторов и увеличение итератора в верхней части тела цикла (перед изменением карты):

for (auto it = ItemsList.begin(); it != ItemsList.end(); ) {
     auto &p = *it;
     ++it;
     // rest of for loop
}
8
задан Community 23 May 2017 в 11:47
поделиться

3 ответа

От os.walk документы:

Когда сверху вниз верно, вызывающая сторона может изменить оперативный список dirnames (возможно, использующий del или присвоение части), и обход () только рекурсивно вызовет в подкаталоги, имена которых остаются в dirnames; это может использоваться для сокращения поиска

Таким образом, что-то вроде этого должно работать:

for root, dirnames, filenames in os.walk(...):
  dirnames[:] = [
    dir for dir in dirnames
    if not os.path.ismount(os.path.join(root, dir))]
  ...
16
ответ дан 5 December 2019 в 08:26
поделиться

os.walk() не может сказать (насколько я знаю), что это просматривает другой диск. Необходимо будет проверить что сами.

Попытайтесь использовать os.stat(), или проверка, что корневая переменная от os.walk() не /media

1
ответ дан 5 December 2019 в 08:26
поделиться

Я думаю, что os.path.ismount мог бы работать на Вас. Вы кодируете, мог бы выглядеть примерно так:

import os
import os.path
for root, dirs, files in os.walk('/'):
    # Handle files.
    dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), 
                  dirs)

Можно также найти этот ответ полезным в создании решения.

*Спасибо за комментарии по поводу фильтрации dirs правильно.

3
ответ дан 5 December 2019 в 08:26
поделиться
Другие вопросы по тегам:

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