Решено это с рекурсией:
def get(d,l):
if len(l)==1: return d[l[0]]
return get(d[l[0]],l[1:])
Используя ваш пример:
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
maplist1 = ["a", "r"]
maplist2 = ["b", "v", "y"]
print(get(dataDict, maplist1)) # 1
print(get(dataDict, maplist2)) # 2
Для таких, как я, которые нащупывали ваш путь через многозадачные учебники и документы, но я просто хочу увидеть, что работает для стартеров, я нашел единственное мне нужно было добавить:
AddHandler cgi-script .pl .cgi
К моему конфигурационному файлу.
http: // httpd .apache.org / docs / 2.2 / mod / mod_mime.html # addhandler
Для моей ситуации это работает лучше всего, так как я могу поместить свой скрипт perl где угодно, и просто добавлю .pl или .cgi.
Ответ Дейва Шеохмана также упоминает решение AddHandler.
Конечно, вы все равно должны убедиться, что права / права на ваш скрипт установлены правильно, особенно, что скрипт будет исполняемым. Обратите внимание, кто «пользователь» при запуске из HTTP-запроса, например, www или www-data.
Если вы успешно установили веб-сервер Apache и Perl, выполните следующие шаги для запуска скрипта cgi с использованием perl в системах ubuntu.
Перед началом работы с CGI-скриптами необходимо настроить сервер Apache в таком способ, которым он распознает каталог CGI (где сохраняются программы cgi) и разрешает выполнение программ в этом каталоге.
mkdir /usr/lib/cgi-bin
ls -l /usr/lib | less
Проверьте, выглядит ли разрешение «drwxr-xr-x 2 root root 4096 2011-11-23 09:08 cgi- bin», если да, переходите к шагу 3.
Если не выполнить следующую команду для обеспечения соответствующего разрешения для нашего каталога cgi-bin.
sudo chmod 755 /usr/lib/cgi-bin
sudo chmod root.root /usr/lib/cgi-bin
sudo chmod 755 /usr/lib/cgi-bin
Таким образом, ваш каталог cgi-bin готов к работе. Здесь вы накладываете все свои скрипты cgi на исполнение. Следующий шаг - настроить apache для распознавания каталога cgi-bin и разрешить выполнение всех программ в нем как cgi-скриптов.
Настройка Apache для запуска скрипта CGI с использованием perl
cd /etc/apache2/sites-available/
sudo gedit 000-default.conf
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
sudo service apache2 restart
sudo a2enmod cgi.load
sudo a2enmod cgid.load
sudo service apache2 reload
Конфигурационная часть apache завершена, теперь проверим ее с помощью программы cgi perl.
Тестирование
cd /usr/lib/cgi-bin/
sudo gedit test.pl
#!/usr/bin/perl -w
print “Content-type: text/html\r\n\r\n”;
print “CGI working perfectly!! \n”;
sudo chmod 755 test.pl
Примечание. Не забудьте указать свои новые программы в cgi-bin, chmod 755, чтобы успешно запускать его без каких-либо внутренних ошибок сервера.
(поиск Google привел меня к этому вопросу, хотя я не просил perl)
У меня была проблема с запущенными скриптами (хотя bash not perl). Apache имел конфигурацию ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
, однако журнал ошибок Apache показал File does not exist: /var/www/cgi-bin/test.html
.
Пробовал помещать скрипт в оба /usr/lib/cgi-bin/
и /var/www/cgi-bin/
, но ни один из них не работал.
После продолжительная сессия по поиску в Google, что взломало ее для меня, было sudo a2enmod cgi
, и все встало на свои места с помощью /usr/lib/cgi-bin/
.
a2enmod cgi
, иначе это не сработает.
– Andrea Gottardo
5 January 2016 в 10:12
a2enmod cgi
исправил это для меня тоже! Этот ответ действительно заслуживает большего количества голосов.
– Saurabh
8 May 2016 в 19:43
Существует два способа обработки сценариев CGI, SetHandler
и AddHandler
.
SetHandler cgi-script
применяется ко всем файлам в с учетом контекста , независимо от того, как они названы, даже index.html
или style.css
.
AddHandler cgi-script .pl
аналогичен, но применяется к файлам, заканчивающимся на .pl
, в данный контекст. Вы можете выбрать другое расширение или несколько, если хотите.
Кроме того, модуль CGI должен быть загружен и Options +ExecCGI
настроен. Чтобы активировать модуль, введите
a2enmod cgi
и перезапустите или перезагрузите Apache. Наконец, скрипт Perl CGI должен быть исполняемым. Поэтому бит выполнения должен быть установлен
chmod a+x script.pl
, и он должен начинаться с
#! /usr/bin/perl
в качестве первой строки.
Когда вы используете SetHandler
или AddHandler
(и Options +ExecCGI
) вне любой директивы, он применяется глобально ко всем файлам. Но вы можете ограничить контекст подмножеством, включив эти директивы внутри, например. Directory
<Directory /path/to/some/cgi-dir>
SetHandler cgi-script
Options +ExecCGI
</Directory>
Теперь SetHandler
применяется только к файлам внутри / path / to / some / cgi-dir, а не ко всем файлам веб-сайта. То же самое с AddHandler
внутри директивы Directory
или Location
, конечно. Затем он применяется к файлам внутри / path / to / some / cgi-dir, заканчивающимся на .pl
.
Начиная с Ubuntu 12.04 (Precise Pangolin) (и, возможно, релиз или два раньше) просто устанавливают apache2
и mod-perl
через Synaptic и помещают ваши CGI-скрипты в / usr / lib / cgi -bin - это все, что вам нужно сделать.
AddHandler cgi-script .cgi .pl
. Тогда есть блок кода. Где мы предположим, чтобы это точно?
– cpb2
7 March 2015 в 16:32
.cgi
на другой тип сервера? как puma
: |
– user
20 August 2016 в 13:25
Я предполагаю, что вы взглянули на mod_perl ?
Пробовали ли вы учебник ?
] EDIT: в отношении вашей публикации - возможно, вы могли бы включить образец кода в свой файл .cgi
. Возможно, даже первые несколько строк?