LINUX.ORG.RU

Переписать скрипт с python на perl

 , , , бесплатные негры


0

4

Набросал вот такой скриптик на python. Он читает multipart form-data запрос и запихивает его во временные файлы, выводя их список (тип, название, временный файл), готовый для парсинга в недоязыках вроде bash.

Вот он:

import cgitb
import cgi
import os
import tempfile

# Generator to buffer file chunks
def fbuffer(f, chunk_size=10000):
   while True:
      chunk = f.read(chunk_size)
      if not chunk: break
      yield chunk

cgitb.enable()

form = cgi.FieldStorage()

for param in form:
	if form[param].filename:
		(fd, temp) = tempfile.mkstemp()
		f = open(temp, 'wb', 10000)
		# Read the file in chunks
		for chunk in fbuffer(form[param].file):
			f.write(chunk)
		f.close()
		print "file " + form[param].filename + " " + temp
	else:
		(fd, temp) = tempfile.mkstemp()
		f = open(temp, 'wb', 10000)
		# Write param to the file
		f.write(form[param].value)
		f.close()
		print "param " + param + " " + temp

Буду признателен, если кто-нибудь перепишет его на perl или на другом легком интерпретируемом языке. Сам пытался, не получилось, слишком плохо я перл знаю.

★★★★★

Последнее исправление: derlafff (всего исправлений: 2)
Ответ на: комментарий от AnDoR

Нуачо. Я не питонщек, мне можно

derlafff ★★★★★
() автор топика

если кто-нибудь перепишет его на perl или на другом легком интерпретируемом языке

зачем это нужно? Могу переписать на py3k. Держи:

$ 2to3 ./shit.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored ./shit.py
--- ./shit.py (original)
+++ ./shit.py (refactored)
@@ -21,12 +21,12 @@
         for chunk in fbuffer(form[param].file):
             f.write(chunk)
         f.close()
-        print "file " + form[param].filename + " " + temp
+        print("file " + form[param].filename + " " + temp)
     else:
         temp=os.popen("mktemp").read().split('\n')[0]
         f = open(temp, 'wb', 10000)
         # Write param to the file
         f.write(form[param].value)
         f.close()
-        print "param " + param + " " + temp
+        print("param " + param + " " + temp)
 

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Perl монахи смотрят, снисходительно улыбаясь.

anonymous
()

Как-то так.

#!/usr/bin/env perl

use Mojolicious::Lite;
use File::Basename 'dirname';

my $dir = dirname __FILE__;

get '/' => 'index';

post '/' => sub
    {
        my $this = shift;
        
        # Check file size
        return $this->render( text => 'File is too big.', status => 400 )
            if $this->req->is_limit_exceeded;
        
        my @files = $this->param();
        my @info;
        
        # For all files
        for my $p ( @files )
        {
            my $upload = eval { $this->req->upload($p) } || next;
            my $name = time .'-'. ( int rand 100_000 );
            
            $upload->move_to( "$dir/tmp/$name" );
            
            push @info, {
                            path => "$dir/tmp/$name",
                            filename => $upload->filename,
                            type => $upload->headers->content_type
                        }
        }
        
        # Render
        $this->stash( info => \@info );
        $this->render('result');
    };

app->start('cgi');

__DATA__

@@ index.html.ep
% layout 'default';
% title 'Upload';
<form action="/" enctype="multipart/form-data" method="post">
    <input name="file1" type="file">
    <input name="file1" value="file1" type="hidden">
    <input name="file2" type="file">
    <input name="file2" value="file2" type="hidden">
    <input type="submit">
    </div>
</form>

@@ result.html.ep
% layout 'default';
% title 'Upload';
<div>
    Files:
    <ol>
    % if ( $info )
    % {
    %   for my $file ( @$info )
    %   {
          <li>
            <%= $file->{filename} %><br>
            <%= $file->{path} %><br>
            <%= $file->{type} %>
          </li>
    %   }
    % }
    </ol>
</div>

@@ layouts/default.html.ep
<!doctype html><html>
  <head><title><%= title %></title></head>
  <body><%= content %></body>
</html>
helios ★★★★★
()
Ответ на: комментарий от helios

Ага, класс. Вместо нескольких строк на питоне какой-то монстр, тянущий за собой Mojolicious пожирающий 30 метров памяти.

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

Вместо нескольких строк на питоне какой-то монстр

Где «монстр»? Или вам не нравится как определены шаблоны?

тянущий за собой Mojolicious пожирающий 30 метров памяти.

Кто «пожирает 30 метров»? Нету такого.

Тут ещё фишка в том, что можно сделать app->start('daemon'); и не париться за то, кто будет обрабатывать сей скрипт. То есть он поднимется сам, без помощи apache и иже с ним.

А можно перед ним поставить hypnotoad и вообще получить боевой сервер.

helios ★★★★★
()
Ответ на: комментарий от helios

Именно этот daemon и пожирает. Если не 30, то 20 точно, и это в минимальном приложении. Не думаю, что в режиме cgi меньше, плюс стартует оно в cgi не быстро.
Короче, use CGI.

Olegymous ★★★
()
Ответ на: комментарий от Olegymous

То, что я кинул, как раз в демоне у меня ест 16.8МБ (Linux 3.2.0-24-generic #39-Ubuntu SMP Mon May 21 16:52:17 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux). Скрипт на CGI будет есть где-то 2 метра. Но оно будет требовать ещё какой-нибудь сервер-пускалку, при каждом запросе по-новой выполняться.

Короче, CGI RIP.

helios ★★★★★
()
Ответ на: комментарий от helios

Бесспорно, только автор помоему cgi и использует.

Olegymous ★★★
()
Ответ на: комментарий от derlafff

У нас тут выше диспут... В итоге хотелось бы узнать: тебе реально нужен cgi, или же ты его выбрал, как самый простой путь?

helios ★★★★★
()
Ответ на: комментарий от helios

тебе реально нужен cgi, или же ты его выбрал

мне реально нужен cgi. хотя, можно и без него вовсе

как самый простой путь?

я выбрал его не потому, что он слишком простой, а потому, что мне не нравятся существующие веб-фреймворки. в итоге я хочу получить cgi-библиотеку на bash с некоторым намеком на фреймворк

derlafff ★★★★★
() автор топика
import cgitb
import cgi
import os
import tempfile

# Generator to buffer file chunks
def fbuffer(f, chunk_size=10000):
   while True:
      chunk = f.read(chunk_size)
      if not chunk: break
      yield chunk

cgitb.enable()

form = cgi.FieldStorage()

for param in form:
	fd, temp = tempfile.mkstemp()
	f = open(temp, 'wb', 10000)
	if form[param].filename:
		# Read the file in chunks
		for chunk in fbuffer(form[param].file):
			f.write(chunk)
		f.close()
		print "file " + form[param].filename + " " + temp
	else:
		# Write param to the file
		f.write(form[param].value)
		f.close()
		print "param " + param + " " + temp

P.S.: за табы тебя надо сжечь

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Хотя, знаешь, файлы поддерживают итерацию как минимум в py3k. Правда, что именно возвращает модуль cgi под видом файла я не знаю.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

файлы поддерживают итерацию вроде как с 2.1, но ведь цикл for это не ленивое выражение. Вот здесь

for chunk in form[param] .file.read(chunk):
итерация будет идти по строке, которую откусит form[param] .file.read(chunk), а не будет вычисляться каждый раз.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

так сделай for chunk in form[param].file :). У file есть __iter__. По крайней мере если сделать file=open(). А что у cgi внутри под видом файла я хз.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin
for chunk in form[param].file

Так у тебя получится построчный итератор по файловому объекту, а человеку надо конкретный размер chunk'а, вот в чём вопрос.

А что у cgi внутри под видом файла я хз.

Там, внезапно, файловый (или подобный) объект, судя по докам.

P.S.: А о чём, собственно, мы спорим? :-)

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Виртуоз, всё хочу у тебя спросить - какую литературу, уровнем выше чем dive into python, ты бы посоветовал?

anonymous
()
Ответ на: комментарий от Virtuos86

построчный итератор по файловому объекту

Кто сказал что построчный? Это же не текстовой файл. Думаю он будет соответствовать размеру буфера.

человеку надо конкретный размер chunk'а, вот в чём вопрос.

нафига ему это? Он просто не хочет весь файл целиком в память засасывать, вот и всё.

true_admin ★★★★★
()
Ответ на: комментарий от jessey

А тебя за табуляцию не четырьмя каноничными пробелами.



Где именно? Я лишь чуть подправил чужой код. Перегонять его при этом под пеп8 не имею привычки.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

Я не профессиональный программист, поинтересуйся у них или поищи по темам на лоре.
Если интересует конкретно моё мнение, то - ничего. Теория мертва, погрузился - плыви.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Почему? Мне очень интересно, я не буду троллить, честное слово. Просто, я часто вижу как ты даешь грамотные советы по написанию кода на python, и я очень удивился, когда узнал, что ты не проггер.

anonymous
()
Ответ на: комментарий от anonymous

Балерина?


Ты хреновый Шерлок :), это всего лишь теги, по которым чаще всего бывают интересные мне обсуждения , вот и всё. Что ты там надеялся увидеть: «сиськи», «аниме» и прочую шелуху, что ли.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

Хобби. Кто-то рыбачит, кто-то пишет плохую музыку, а я даю «грамотные советы по написанию кода на python». Неграмотные, кстати, тоже, правда, предупреждаю об этом.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Не, ты не понял скептицизм. Непрограммист с моей точки зрения не особо интересуется размышлениями о декларативных языках/функциональном программировании и как бы жизнь была лучше, если бы не было войны^W ai winter.

Исключения конечно бывают, вот я и интересуюсь, что ты за исключения. Если работник смежной области - инженер по сетям, к примеру - я не особо удивлюсь, если же не из смежной области, то охну ;)

Вот, ты меня заинтриговал, так что колись, виртуоз - кем работаешь/какая профессия. Не ломайся как девочка ;)

anonymous
()
Ответ на: комментарий от anonymous

Наверняка бы охнул, если не хуже, но я слишком гуманен для этого.

Непрограммист с моей точки зрения не особо интересуется размышлениями о декларативных языках/функциональном программировании и как бы жизнь была лучше, если бы не было войны^W ai winter.


это не про меня

с моей точки зрения


Ещё раз: хобби. Ради него люди вытворяют и более странные вещи, несоответствующие их статусу etc.

А на слабо ловить вообще как-то смешно по итернету, не та обстановка, неэффективно.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

Студент перезревший жи инфа 146%.

zz ★★★★
()
Ответ на: комментарий от Virtuos86

Я вот прошерстил по интернету по твоему нику - нашел твиттер, народ, пару форумов. Область интересов одна: python, python, python. Очень странно для непрограммиста.

Я могу предположить, что ты начал программировать еще до университета. Возможно специальность - философия (или история, возможно искусств). А в свободное время просто пишешь маленькие проги. Если так - молодец. (Без всякого лицемерия говорю). Тут вот объявился zz - со всеми его оговорочками «казалось бы...' он демонстрирует владение сабжем уровнем ниже чем ты. Так что еще раз молодец.

anonymous
()
Ответ на: комментарий от anonymous

Казалось бы причем здесь казалось бы и то что я не большой любитель писать текст :)

Впрочем не претендую на первенство.

zz ★★★★
()
Ответ на: комментарий от zz

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

anonymous
()
Ответ на: комментарий от zz

Или покажи его артифакты от 2005 года в сети, потому что я тоже погуглил из интереса :)

zz ★★★★
()
Ответ на: комментарий от anonymous

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

zz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.