Многовариантный для циклов

В более старых ядрах был файл регулировки яркости где-нибудь в /proc, но я думаю, что это была та же функциональность как /sys в Вашем фрагменте кода. В этом /procфайл там был несколькими уровнями яркости, которую Вы могли использовать, и вероятно то же находится в том механизме. Попытайтесь cat /sys/devices/virtual/backlight/acpi_video0/brightness и проверьте, существует ли информация об уровнях яркости, которые можно использовать.

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

Для предотвращения этой ситуации, Вы могли заменить while цикл for цикл (от 0 до 5, например) с 5 секундами спит с ним. В цикле можно только проверить яркость пять раз и после цикла, Вы могли вычислить среднюю яркость и установить ее.

Править: Код со средним числом с 25 секунд:

import opencv
import opencv.highgui
import time
import commands
from time import sleep

def get_image():
    image = opencv.highgui.cvQueryFrame(camera)
    return opencv.adaptors.Ipl2PIL(image)

camera = opencv.highgui.cvCreateCameraCapture(-1)

x = []

for i in range(5):
    image = get_image()
    image.thumbnail((32, 24, ))
    image = tuple(ord(i) for i in image.tostring())
    x.append(int((int((max(image) / 256.0) * 10) + 1) ** 0.5 / 3 * 10))
    sleep(5)

sum = 0
for i in x:
    sum = sum + i

avg = sum / len(x)
cmd = ("sudo su -c 'echo " + str(avg) + " > /sys/devices/virtual/backlight/acpi_video0/brightness'")
status, output = commands.getstatusoutput(cmd)
assert status is 0

К сожалению, у меня нет опции изменить подсветку (старое ядро или что-то отсутствующее в ядре), и у меня нет камеры, чтобы проверить, работает ли это...

12
12.11.2015, 02:00
3 ответа

Во-первых, не читайте строки с для, поскольку существует несколько неизбежных проблем с чтением строк через разделение слова.

Принятие файлов равной длины, или если Вы хотите только к циклу до короче двух файлов, читается, простое решение возможно.

while read -r x && read -r y <&3; do
    ...
done <file1 3<file2

Соединение более общего решения трудно из-за когда read возвращает false и несколько других причин. Этот пример может считать произвольное число потоков и возврата или после самого короткого или после самого длинного входа.

#!/usr/bin/env bash

# Open the given files and assign the resulting FDs to arrName.
# openFDs arrname file1 [file2 ...]
openFDs() {
    local x y i arr=$1

    [[ -v $arr ]] || return 1
    shift

    for x; do
        { exec {y}<"$x"; } 2>/dev/null || return 1
        printf -v "${arr}[i++]" %d "$y"
    done
}

# closeFDs FD1 [FD2 ...]
closeFDs() {
    local x
    for x; do
        exec {x}<&-
    done
}

# Read one line from each of the given FDs and assign the output to arrName.
# If the first argument is -l, returns false only when all FDs reach EOF.
# readN [ -l ] arrName FD1 [FD2 ...]
readN() {
    if [[ $1 == -l ]]; then
        local longest
        shift
    else
        local longest=
    fi

    local i x y status arr=$1
    [[ -v $arr ]] || return 1
    shift

    for x; do
        if IFS= read -ru "$x" "${arr}[i]" || { unset -v "${arr}[i]"; [[ ${longest+_} ]] && return 1; }; then
            status=0
        fi
        ((i++))
    done
    return ${status:-1}
}

# readLines file1 [file2 ...]
readLines() {
    local -a fds lines
    trap 'closeFDs "${fds[@]}"' RETURN
    openFDs fds "$@" || return 1

    while readN -l lines "${fds[@]}"; do
        printf '%-1s ' "${lines[@]}"
        echo
    done
}

{
    readLines /dev/fd/{3..6} || { echo 'error occured' >&2; exit 1; }
} <<<$'a\nb\nc\nd' 3<&0 <<<$'1\n2\n3\n4\n5' 4<&0 <<<$'x\ny\nz' 5<&0 <<<$'7\n8\n9\n10\n11\n12' 6<&0

# vim: set fenc=utf-8 ff=unix ts=4 sts=4 sw=4 ft=sh nowrap et:

Таким образом, в зависимости от ли readN добирается -l, вывод также

a 1 x 7
b 2 y 8
c 3 z 9
d 4 10
5 11
12

или

a 1 x 7
b 2 y 8
c 3 z 9

Необходимость считать несколько потоков в цикле, не сохраняя все в несколько массивов не является всем этим распространенным. Если Вы просто хотите считать массивы, необходимо взглянуть на mapfile.

11
27.01.2020, 19:56
  • 1
    || не работает на меня. Это обрабатывает file1 затем file2, но это действительно сохраняет файлы синхронизируемыми с &&, который выходит из цикла с условием продолжения на первый eof. - 4.1.5 –  Peter.O 21.06.2012, 02:30
  • 2
    , который у меня не было свободного момента для тестирования - да, Вы, вероятно, захотите оба элемента на повторение. || оператор "списка" закорачивает как на большинстве языков. Конечно, этому ответили тысячу раз прежде... –  ormaaj 21.06.2012, 13:48
  • 3
    Точка не является частотой того, как часто что-то было упомянуто прежде. Скорее случается так, что код, который Вы в настоящее время показываете в своем ответе, не работает. На основе Ваш, "вероятно, хочу оба элемента..", это кажется, что Вы все еще не протестировали его. –  Peter.O 21.06.2012, 16:31
  • 4
    @Peter. O я знаю. Это было зафиксировано. –  ormaaj 23.06.2012, 17:52

Сделайте - сделанный; сделанный - Вам нужны два четверок и два dones:

for i in $(< file1); do for j in $(< file2); do echo $i $j;done ; done

File2, конечно, обрабатывается для каждого слова в file1 однажды.

Используя <вместо кошки должно быть обыкновенное увеличение производительности в большинстве случаев. Никакой подпроцесс не включен. (Не уверенный в последнем предложении).

Несжатый:

for i in $(< file1)
do
  for j in $(< file2)
  do
    echo $i $j
  done
done

Если Вам не нравится читать слова, но строки, и сохранить пробел, используют, в то время как и читайте:

while read line; do while read second; do echo "${line}${second}"; done <file2 ; done <file1

Если Вы хотите добавить 2 файла и не вложить их:

cat file1 file2 | while read line; do echo "${line}"; done

Если Вы хотите архивировать 2 файла, используйте вставку:

paste file1 file2
2
27.01.2020, 19:56
  • 1
    Вы говорите, что нет никакого подпроцесса involed. Не () подоболочка? Я не хочу быть pendantic, но я не уверен, что происходит теперь. Например, я знаю, что, когда у меня есть сценарий и я не хочу, чтобы он загрязнил текущую оболочку CD, например, я делаю это в (). Также выполнение (сон 4) и например сопровождаемый PS показывает мне, процесс все еще работает. Можно ли уточнить. –  Silverrocker 21.06.2012, 00:55
  • 2
    Хорошо - я сожалею, я очень действую без зада здесь. Я думал, что слышал так, но возможно это только < по сравнению с cat. И я не уверен, как протестировать его, и когда это станет семантически важным. Если каналы вызываются, переменные в подпроцессах не пузырятся до основного процесса, но у нас нет переменных здесь. Я перечеркиваю критическое предложение, пока кто-то не может разъяснить его. –  user unknown 21.06.2012, 01:03

while имеет interesitng синтаксис. Можно поместить несколько команд перед do ... while цикл и рассматриваемый случай, возможно, должны манипулировать этой функцией, в зависимости от Ваших конкретных требований: Вы читаете в конец самого длинного файла, или только в конец самого короткого.

Например, read || read просто не работает (согласно требованиям вопроса), becase, когда чтение первого файла true, чтение второго файла пропускается, пока первый файл не был считан от начала до конца... Затем потому что состояние тихо true, цикл с условием продолжения продолжает и читает второй файл от начала до конца.

read && read считает файлы одновременно (синхронно), если Вы только захотите читать до самого короткого файла. Однако, если Вы хотите считать оба файла в eof, затем необходимо работать с while's требования синтаксиса, т.е. командой сразу перед do while цикл, производящий ненулевой код возврата для убегания из цикла с условием продолжения.

Вот пример того, как считать оба файла в eof

while IFS= read -r line3 <&3 || ((eof3=1))
      IFS= read -r line4 <&4 || ((eof4=1))
      !((eof3 & eof4))
do
    echo "$line3, $line4"
done 3<file3 4<file4

(можно хотеть протестировать eof3 и eof4 перед чтением, но общее представление там, особенно в заключительном истинном/ложном условии.

0
27.01.2020, 19:56

Теги

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