В более старых ядрах был файл регулировки яркости где-нибудь в /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
К сожалению, у меня нет опции изменить подсветку (старое ядро или что-то отсутствующее в ядре), и у меня нет камеры, чтобы проверить, работает ли это...
Во-первых, не читайте строки с для, поскольку существует несколько неизбежных проблем с чтением строк через разделение слова.
Принятие файлов равной длины, или если Вы хотите только к циклу до короче двух файлов, читается, простое решение возможно.
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
.
Сделайте - сделанный; сделанный - Вам нужны два четверок и два 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
<
по сравнению с 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 перед чтением, но общее представление там, особенно в заключительном истинном/ложном условии.
||
не работает на меня. Это обрабатывает file1 затем file2, но это действительно сохраняет файлы синхронизируемыми с&&
, который выходит из цикла с условием продолжения на первый eof. - 4.1.5 – Peter.O 21.06.2012, 02:30||
оператор "списка" закорачивает как на большинстве языков. Конечно, этому ответили тысячу раз прежде... – ormaaj 21.06.2012, 13:48