РЕШЕНИЕ:Я понял, что эта ошибка возникла, потому что моя установка Python находилась в моем каталоге home
. Таким образом, у Apache не было разрешения на доступ к среде.
Чтобы решить эту проблему, я сделал следующее:
Удалена моя установка anaconda3:
[ec2-user@ip] ~ $ rm -rf anaconda3/
# -- be sure to remove directories.conda/ and.anaconda_backup/ -- #
# -- these should be in the same directory as the anaconda3/ directory -- #
Re -установил anaconda3 как root в каталог /usr/local
(, доступный всем пользователям, работает с Apache):
[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ cd /usr/local
[root@ip] ~ $ wget https://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh
# ^ whichever version you want. Go to https://repo.continuum.io/archive/
[root@ip] ~ $ bash Anaconda3-5.1.0-Linux-x86_64.sh
# specify your path when prompted --> /usr/local/anaconda3
# note that directory /usr/local/anaconda3 cannot exist prior to running the command
Добавьте строку export PATH='/usr/local/anaconda3/bin:$PATH'
в конец вашего файла /root/.bashrc КАК ПОЛЬЗОВАТЕЛЯ ROOT! (отредактируйте старый путь к anaconda3, если он уже существует в конце этого файла)
[root@ip] ~ $ vi /root/.bashrc # -- add/edit the line here -- #
[root@ip] ~ $ source /root/.bashrc
Убедитесь, что пользователь root использует правильную версию Python:
[root@ip] ~ $ which python
/usr/local/anaconda3/bin/python
Выйти как пользователь root:
[root@ip] ~ $ exit
Убедитесь, что правильная версия Python работает как пользователь по умолчанию:
[ec2-user@ip] ~ $ which python
/usr/local/anaconda3/bin/python
Если это печатает /usr/bin/python
или что-то другое, чем /usr/local/anaconda3/bin/python
, убедитесь, что вы добавили PATH, указанный выше, в файл ~/.bashrc вашего пользователя (, точно так же, как вы делали это как пользователь root)
ПРИМЕЧАНИЕ. :Все новые установки/настройки среды теперь должны выполняться с правами ROOT. т.е.:
[ec2-user@ip] ~ $ sudo su -
[root@ip] ~ $ conda install flask
...
[root@ip] ~ $ exit
# -- open Python to verify that your installation worked -- #
[ec2-user@ip] ~ $ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
# -- shouldn't throw an ImportError -- #
>>> exit()
Если кто-то наткнется на это в будущем, КОММЕНТАРИЙ! Я хотел бы быть в состоянии предложить некоторую помощь.
Удачи!
sed -n '1h;2,10H;11G;11,$p'
Первая строка, скопируйте h
из-за новой строки, затем добавьте H
до 10.
В строке 11 получите место для удержания
От 11 до конца, распечатать.
]# sed -n '1h;2,10H;11G;11,$p' bonj
French: Bonjour
English: Hello
Turkish: Marhaba
Italian: Ciao
German: Hallo
Spanish: Hola
Latin: Salve
Greek: chai-ray
Welsh: Helo
Finnish: Hei
Breton: Demat
Так лучше:
]# seq 20 | sed -n '1h;2,10H;11G;11,$p'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15
16
17
18
19
20
Я беру твой пример:
]# sed -e 1p -e 11p -n bonj
English: Hello
French: Bonjour
...с переключателем -n
в конце, чтобы показать, что он учитывается для обоих выражений.
У меня также есть -n
, а затем 1h;2,10H
, который должен быть просто 1,10H
, который представляет собой диапазон номеров строк и команду «удерживать» (сохранить ). Пока ничего не печатается.
11,$p
— другой диапазон. В строке 11 печатается то, что `11G' только что получил из удержания (, т.е. 1 -10 ), и добавляется к строке 11.
Строки с 12 по $ просто печатаются сами по себе из-за -n
.
Я должен сделать два -e
таких, как ты:
sed -n -e '1h;2,10H' -e '11G;11,$p'
От 1,10 - холд, от 11,$ - печать.
В строке 11 сначала G
, затем p
. Это важно, потому что:
]# seq 20 | sed -n -e '1h;2,10H' -e '11,$p;11G'
11
12
13
14
15
16
17
18
19
20
Здесь строка 12 стирает то, что строка 11 получила после печати.
Как функция с параметрами
Всегда скучно в одиннадцатой строке с функцией "поместить первым":
]# declare -f putfirst
putfirst ()
{
e="1h;2,$(($1-1))H;${1}G;${1},\$p";
sed -ne "$e" $2
}
Два шага :генерация строки, затем вызов sed. "$" имеет два значения :"p" не является переменной!
Это наименьшее число, которое работает:
]# seq 7 | putfirst 3
3
1
2
4
5
6
7
Или с исходным файлом "bonj":
]# putfirst 4 bonj | putfirst 6 |head -4
Latin: Salve
German: Hallo
English: Hello
Turkish: Marhaba
Это два sed подряд, но теперь выполняются две операции.
Перл
perl -ne '$n++; $h.=$_ if $n<11; print $_.$h if $n==11; print if $n>11' <(seq 20)
И как некий скрипт, который принимает имя файла и не нуждается в опциях:
$want=11 ;
while (<>) {
$n++ ;
if ($n < $want) # before $want: store line
{ $lowlines.= $_ ;
next } # next line (avoids 'else')
if ($n == $want) # at line $want: append stored lines to $_
{ $_.= $lowlines }
print ; # print $_ for $n not less than $want
}
AWK(украдено у Эда (не редактор!))
NR < 11 {
buf[NR] = $0; next
}
NR >=11 {
print
if (NR == 11) {
for (i=1; i<11; i++) { print buf[i] }
}
}
Я использовал NR
вместо увеличения n
и сделал поток более явным. Тот же «трюк» :упрощает next
нисходящий поток.
Сperl -n
$n++ ;
$tmp = $tmp. $_ if $n < 11 ;
print $_. $tmp if $n == 11 ;
print $_ if $n > 11 ;
Это лучший формат. Симметричный.
Если я правильно понял, вы просто хотите переместить 11-ю строку на первую строку.
Итак, если ваш оригинал выглядел как
Original line 1
Original line 2
...
Original line 18
Original line 19
Original line 20
Тогда результатом будет
Original line 11
Original line 1
Original line 2
...
Original line 9
Original line 10
Original line 12
Original line 13
...
Original line 19
Original line 20
Этого можно добиться с помощью двух проходов через файл, но первый проход может быть коротким -обрезанным, так что это не слишком ужасно
( sed -n '11 {p;q}' file ; sed 11d file ) > newfile
По сути, первая команда sed
печатает только строку 11, а затем завершает работу. Вторая команда sed
печатает каждую строку , кроме строки 11.
В результате строка 11 фактически перемещается в начало нового файла.
После того, как я опубликовал свой первоначальный ответ ниже, я понял, что наличие массива было излишним, и все, что вам действительно нужно, это:
awk '
NR < 11 { buf = buf $0 ORS; next }
{
print
printf "%s", buf
buf = ""
}
' file > new_file
напр.:
$ seq 15 | awk '
NR < 11 { buf = buf $0 ORS; next }
{
print
printf "%s", buf
buf = ""
}
'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15
Исходный ответ с использованием массива вместо скалярной переменной для буфера:
awk '
NR < 11 { buf[++bufSz] = $0; next }
{
print
for (i=1; i<=bufSz; i++) {
print buf[i]
}
bufSz = 0
}
' file > new_file
напр.:
$ seq 15 | awk '
NR < 11 { buf[++bufSz] = $0; next }
{
print
for (i=1; i<=bufSz; i++) {
print buf[i]
}
bufSz = 0
}
'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15
СPOSIX sed
:
$ sed -e '1,11!b' -e '11!H;1h;11!d;G' file
Использованиеperl
:
$ perl -lne '
push(@A,$_),next if $. < 11;
print for $_, splice @A;
' file
Использованиеbash
:
$ (head -n 11 - | tee log | tail -n 1 -; head -n 10 log; cat -;) < file
Более простой sed, чем выложенные (POSIX, без меток):
seq 20 | sed '1,10{H;1h;d;};11G'
Это :в строках с 1 по 10, заполните пробел этими строками (не печатайте ). В строке 11 верните пробел и позвольте sed использовать значение по умолчанию с этого момента :, просто печатайте каждую строку. Обратите внимание, что после строки 11 сценарий не является операцией -, просто оставьте sed по умолчанию, может быть, быстрее.
В ОК:
awk 'NR <11{ hold=hold RS $0 }
NR==11{ print $0, hold }
NR >11
' file
В один вкладыш:
$ seq 15 | awk 'NR<11{hold=hold RS $0}NR==11{print $0,hold}NR>11'
11
1
2
3
4
5
6
7
8
9
10
12
13
14
15