From 525c93a1065d1d53c2e850538771fc96ebf4eae4 Mon Sep 17 00:00:00 2001 From: Ville Rantanen Date: Fri, 9 Apr 2021 13:01:04 +0300 Subject: [PATCH] forcing everything python3, might end up with bugs --- README.md | 2 +- bin/ansi-codes | 2 +- bin/clockcurses | 16 +++--- files/archive-files | 2 +- files/archive-subfolders | 2 +- files/chr2pix | 2 +- files/file_list.py | 26 ++++++---- files/file_version.py | 2 +- files/image_list_tagger.py | 42 +++++++-------- files/rsync-queue | 13 ++--- files/sponge | 2 +- qcd_function | 2 +- skel/dispchooser | 16 +++--- tsv/lib/tsvhead | 14 ++--- tsv/lib/tsvtail | 14 ++--- tsv/sc2tsv.py | 24 ++++----- tsv/tsv2sc.py | 49 +++++++++-------- tsv/tsvedit.py | 73 ++++++++++++++------------ tsv/tsvkit.sh | 50 +++++++++--------- tsv/tsvplot.py | 38 +++++++------- vnc/vncdisp | 16 +++--- web/droopy | 104 +++++++++++++++++++------------------ web/ftpserver | 8 +-- 23 files changed, 276 insertions(+), 243 deletions(-) diff --git a/README.md b/README.md index 6dd174f..7588f5e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Many of the tools use common unix tools. Some extra tools are required. Here are the installation commands. ``` -sudo apt-get install git sqlite3 python python-magic python-pip python-gtk2 sc \ +sudo apt-get install git sqlite3 python3 python3-magic python3-pip python3-gtk2 sc \ gnuplot wget vim rsync curl pv pip2 install csvkit ncsv diff --git a/bin/ansi-codes b/bin/ansi-codes index 693bb29..985b1fd 100755 --- a/bin/ansi-codes +++ b/bin/ansi-codes @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys,os sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), diff --git a/bin/clockcurses b/bin/clockcurses index d02570e..409d5a0 100755 --- a/bin/clockcurses +++ b/bin/clockcurses @@ -1,10 +1,10 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import curses import os,sys import time,datetime import math import signal -from optparse import OptionParser +from optparse import OptionParser def termsize(): @@ -20,7 +20,7 @@ def saddstr(win,y,x,s): win.addstr(y,x,s) except: pass - + def drawcircle(win,cy,cx,r): precision=360 for a in range(precision): @@ -37,9 +37,9 @@ def drawline(win,cy,cx,a,s,r,char): ly=int(round(cy-float(l)*math.cos(a)/prec)) lx=int(round(cx+2.0*float(l)*math.sin(a)/prec)) saddstr(win,ly,lx,char) - + return - + def drawdigit(win,y,x,d): s=' ' if d=='0': @@ -98,7 +98,7 @@ def readinput(win): return "" class timer_struct: - """ Class for storing timer. """ + """ Class for storing timer. """ def __init__(self,h,m,s): self.tm_hour=int(h) self.tm_min=int(m) @@ -149,7 +149,7 @@ def main(): stdscr.keypad(0) curses.endwin() sys.exit(0) - + except KeyboardInterrupt: curses.nocbreak() stdscr.keypad(0) @@ -159,7 +159,7 @@ def main(): usage='''Usage: %prog [options] -Display a clockface +Display a clockface ''' parser=OptionParser(usage=usage) parser.add_option("-s",action="store_true",dest="seconds",default=False, diff --git a/files/archive-files b/files/archive-files index 9bf079d..2de757f 100755 --- a/files/archive-files +++ b/files/archive-files @@ -19,7 +19,7 @@ function listfiles() { } function count_size() { - cat - | python -c "import sys + cat - | python3 -c "import sys def sizeof_fmt(num, suffix='B'): for unit in ['','K','M','G','T','P','E','Z']: if num < 1024.0: diff --git a/files/archive-subfolders b/files/archive-subfolders index 232f5ae..22c15eb 100755 --- a/files/archive-subfolders +++ b/files/archive-subfolders @@ -22,7 +22,7 @@ function listfolders() { } function count_size() { - cat - | python -c "import sys + cat - | python3 -c "import sys def sizeof_fmt(num, suffix='B'): for unit in ['','K','M','G','T','P','E','Z']: if num < 1024.0: diff --git a/files/chr2pix b/files/chr2pix index 7b4444b..ea7e4b2 100755 --- a/files/chr2pix +++ b/files/chr2pix @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys import scipy.misc import numpy as n diff --git a/files/file_list.py b/files/file_list.py index 8dd4ed1..10bcc57 100755 --- a/files/file_list.py +++ b/files/file_list.py @@ -1,5 +1,12 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: latin-1 -*- +from __future__ import division +from __future__ import print_function +from future import standard_library +standard_library.install_aliases() +from builtins import zip +from builtins import str +from past.utils import old_div import sys import os import re @@ -8,7 +15,8 @@ import subprocess import hashlib import magic from argparse import ArgumentParser -import ConfigParser,StringIO,io +import configparser +import io import datetime SQLFILE='list_of_files.sqlite' @@ -67,7 +75,7 @@ def setup_options(): BADDIRS.extend(options.exclude) if options.duplicate: options.add=not options.add - options.startpath=unicode(options.startpath, "UTF-8") + options.sqlpath=os.path.dirname(os.path.realpath(options.sqlfile)) return options @@ -78,7 +86,7 @@ def add_recurse(options): db=conn.cursor() prev_path_len=0 for path,dirs,files in os.walk(options.startpath,followlinks=options.symlinks): - sys.stdout.write(("\r%s%s"%(filename_join(path,".",options),(prev_path_len-len(path))*' ')).encode('utf-8')) + sys.stdout.write(("\r%s%s"%(filename_join(path,".",options),(prev_path_len-len(path))*' '))) prev_path_len=len(path) dirs=clean_dirs(dirs) dirs.sort() @@ -218,11 +226,11 @@ def createdb(options): object TEXT)') conn.commit() - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.add_section("General") config.set("General","Relative",str(options.relative)) config.set("General","FullFile",str(options.fullfile)) - store=StringIO.StringIO() + store=io.StringIO() config.write(store) db.execute("INSERT INTO config (object) values (?)",(store.getvalue(),)) conn.commit() @@ -337,7 +345,7 @@ def get_md5(filename,fullfile=False): anim_i=0 anim_len=len(ANIM) block_size=2**24 - percents_per_block=100/(float(fsize)/block_size) + percents_per_block=old_div(100,(old_div(float(fsize),block_size))) md5 = hashlib.md5() with open(filename,'rb') as f: for chunk in iter(lambda: f.read(block_size), b''): @@ -425,7 +433,7 @@ def humanize_size(size,precision=1): defPrecision=0 while size > 1024: suffixIndex += 1 #increment the index of the suffix - size = size/1024.0 #apply the division + size = old_div(size,1024.0) #apply the division defPrecision=precision return "%.*f%s"%(defPrecision,size,suffixes[suffixIndex]) @@ -510,7 +518,7 @@ def stored_options(options): store="" for row in db: store+=row[0]+'\n' - config = ConfigParser.RawConfigParser() + config = configparser.RawConfigParser() config.readfp(io.BytesIO(store)) options.relative=config.getboolean("General","Relative") options.fullfile=config.getboolean("General","FullFile") diff --git a/files/file_version.py b/files/file_version.py index 9fe0fe5..9b56c01 100755 --- a/files/file_version.py +++ b/files/file_version.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os, argparse, sys from shutil import copyfile, copytree from datetime import datetime diff --git a/files/image_list_tagger.py b/files/image_list_tagger.py index 01fe1b2..05b937e 100755 --- a/files/image_list_tagger.py +++ b/files/image_list_tagger.py @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys,os from Tkinter import * from PIL import Image,ImageTk, ImageDraw import math -from argparse import ArgumentParser +from argparse import ArgumentParser import sqlite3 SQLFILE='list_of_images.sqlite' @@ -16,9 +16,9 @@ def setup_options(): parser.add_argument("-t",action="store",dest="tags",default="thisIsGood,thisIsBad", help="Comma separated list of tags") parser.add_argument("-n",action="store",type=int,dest="number",default=0, - help="Number of tags expected. 0 is any amount.") + help="Number of tags expected. 0 is any amount.") parser.add_argument('path', action="store",default='.', nargs='?') - + options=parser.parse_args() options.tags=[x.strip() for x in options.tags.split(",")] return options @@ -26,7 +26,7 @@ def setup_options(): class Click: def __init__(self, image,tags,sqlfile,title,number): - + self.title=title self.root=Tk() self.root.geometry("1024x768+220+0") @@ -40,7 +40,7 @@ class Click: self.img_copy= self.image.copy() self.pixels = self.img_copy.load() self.background_image = ImageTk.PhotoImage(self.image) - + self.background = Label(self.root, image=self.background_image, cursor='cross') self.background.pack(fill="both", expand=True, side="left") self.background.bind('', self._resize_image) @@ -68,14 +68,14 @@ class Click: self.tags[t+1].bind("", self._tag_key) self.tags.append(Button(self.top, text="Custom", command=self._tag_button("custom"))) self.tags[t+2].pack(fill="both", side="top") - + self.top.geometry("220x%d+0+0"%(self.root.winfo_screenheight()-150,)) - + self._resize_init() - + self._init_db(sqlfile) self._print_tags() - + self.root.mainloop() def _tag_key(self,event): @@ -102,12 +102,12 @@ class Click: self.image = self.img_copy.resize((new_width, new_height)) self.background_image = ImageTk.PhotoImage(self.image) self.background.configure(image = self.background_image) - + def _resize_init(self): event = self._get_max_size() self.root.geometry("%dx%d+220+0"% (event.width, event.height)) self._resize_image(event) - + def _get_max_size(self,refer_size=None): """ return max size for image that fits the refer_size,. otherwise, return max size for the screen """ @@ -122,14 +122,14 @@ class Click: if new_width>refer_width: new_width=refer_width new_height=int(float(self.img_copy.size[1])/float(self.img_copy.size[0])*new_width) - event = type('eventclass', (object,), + event = type('eventclass', (object,), {'width':new_width, 'height':new_height})() return event - + def _quit(self,event): self.root.destroy() sys.exit(0) - + def _next(self,event): self.root.destroy() @@ -155,7 +155,7 @@ class Click: if self.numberLimit>0 and self.numberLimit9 if i<10: return str(i) @@ -201,7 +201,7 @@ if os.path.isfile(opt.path): imagelist=[opt.path] else: imagelist=sorted([os.path.join(opt.path,f) for f in os.listdir(opt.path) if IMGMATCH.match(f)]) - + for i,l in enumerate(imagelist): (p,b)=os.path.split( os.path.abspath(l) ) (f,p)=os.path.split( p ) diff --git a/files/rsync-queue b/files/rsync-queue index a330bfe..b4c6fbf 100755 --- a/files/rsync-queue +++ b/files/rsync-queue @@ -1,10 +1,11 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # coding=UTF-8 +from __future__ import print_function import sys import os,time,datetime import sqlite3 import subprocess,shlex -from argparse import ArgumentParser +from argparse import ArgumentParser SQLFILE=os.path.expandvars('$HOME/.rsync-queue.sqlite') @@ -55,7 +56,7 @@ def createdb(fname): conn.text_factory=str db.execute('CREATE TABLE list (id INTEGER PRIMARY KEY AUTOINCREMENT,\ SRC TEXT,TGT TEXT, exitcode INTEGER)') - conn.commit() + conn.commit() return def mark_done(options, SRC,TGT, exitcode): @@ -105,9 +106,9 @@ def list_URLs(options): db.execute("SELECT * FROM list ORDER BY id") else: db.execute("SELECT * FROM list WHERE exitcode > 0 ORDER BY id") - print "EC\tSRC\tTGT" + print("EC\tSRC\tTGT") for row in db: - print "%s\t%s\t%s" % (row[3],row[1],row[2]) + print("%s\t%s\t%s" % (row[3],row[1],row[2])) return def start_sync(options): @@ -121,7 +122,7 @@ def start_sync(options): command=['rsync'] command.extend(syncopts) command.extend([SRC,TGT]) - popen = subprocess.Popen(command, + popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=8) j=1 try: diff --git a/files/sponge b/files/sponge index ba72515..7bf1e17 100755 --- a/files/sponge +++ b/files/sponge @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import sys from argparse import ArgumentParser diff --git a/qcd_function b/qcd_function index 76b0090..7f5a8fe 100644 --- a/qcd_function +++ b/qcd_function @@ -13,7 +13,7 @@ function gcd() { darwin*) QCDPATH=$( dirname $( realpath ${BASH_SOURCE[0]} ) ) ;; *) QCDPATH=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) ) ;; esac - cdto=$( python "$QCDPATH"/files/gcd-findmatch.py "$@" ) + cdto=$( python3 "$QCDPATH"/files/gcd-findmatch.py "$@" ) [[ -z "$cdto" ]] && return \cd "$cdto" } # gcd ends diff --git a/skel/dispchooser b/skel/dispchooser index 87bf46a..947638b 100644 --- a/skel/dispchooser +++ b/skel/dispchooser @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import os import sys @@ -36,16 +36,16 @@ class bc: self.CLR = '' self.CYA = '' self.WHI = '' - + def pos(self,y,x): return "\033["+str(y)+";"+str(x)+"H" class getch: def __init__(self): import sys, tty, termios - + def get(self): - + fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: @@ -57,7 +57,7 @@ class getch: def ichr(i): - ''' convert integer to 1-9, a-z, A-Z, omitting x ''' + ''' convert integer to 1-9, a-z, A-Z, omitting x ''' if i < 10: return str(i) @@ -75,7 +75,7 @@ def drawmenu(entries): twocol=False co=bc() helptext="" - + print(co.END+co.CLR+co.pos(1,3)+co.YEL+'XRandrMenu x:exit '+helptext+co.END) if len(entries)>20: twocol=True @@ -127,7 +127,7 @@ def read_displays(): entries.sort(key=lambda x: x[0]) return entries - + def append_index(entries,offset=0,color=None): e=1+offset for el in range(len(entries)): @@ -153,7 +153,7 @@ def initialize(): entries=read_displays() entries=append_index(entries,offset=0,color=bc.CYA) return entries - + def main(): entries=initialize() print(entries) diff --git a/tsv/lib/tsvhead b/tsv/lib/tsvhead index f568740..be14cdd 100755 --- a/tsv/lib/tsvhead +++ b/tsv/lib/tsvhead @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2015 Ville Rantanen # @@ -17,13 +17,14 @@ # '''simple head for tsv/csv files.''' +from __future__ import print_function __author__ = "Ville Rantanen " __version__ = "0.1" import sys,os,argparse -from argparse import ArgumentParser +from argparse import ArgumentParser def setup_options(): ''' Create command line options ''' @@ -31,7 +32,7 @@ def setup_options(): Simple implementation of head that keeps the header row. ''' - + parser=ArgumentParser(description=usage, formatter_class=argparse.RawDescriptionHelpFormatter, epilog="\n".join(["Version: "+__version__,__author__])) @@ -60,7 +61,7 @@ def behead(fileob,opts): head_ordinary(fileob, opts.lines) else: head_allbutlast(fileob, opts.lines) - + def head_ordinary(fileob, lines): for i,row in enumerate(fileob): if i>lines-1: @@ -82,12 +83,13 @@ def main(): behead(sys.stdin, opts) for fi in opts.file: behead(open(fi,'r'), opts) - except IOError as (n,e): + except IOError as xxx_todo_changeme: + (n,e) = xxx_todo_changeme.args if n==32: pass else: import traceback - print traceback.format_exc() + print(traceback.format_exc()) except KeyboardInterrupt: pass diff --git a/tsv/lib/tsvtail b/tsv/lib/tsvtail index 9b4c469..5ed0f2a 100755 --- a/tsv/lib/tsvtail +++ b/tsv/lib/tsvtail @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2015 Ville Rantanen # @@ -17,13 +17,14 @@ # '''simple tail for tsv/csv files.''' +from __future__ import print_function __author__ = "Ville Rantanen " __version__ = "0.1" import sys,os,argparse -from argparse import ArgumentParser +from argparse import ArgumentParser def setup_options(): ''' Create command line options ''' @@ -31,7 +32,7 @@ def setup_options(): simple implementation of tail, keeping the header row ''' - + parser=ArgumentParser(description=usage, formatter_class=argparse.RawDescriptionHelpFormatter, epilog="\n".join(["Version: "+__version__,__author__])) @@ -64,7 +65,7 @@ def tail(fileob,opts): tail_ordinary(fileob, opts.lines) else: tail_allbutfirst(fileob, -opts.lines) - + def tail_allbutfirst(fileob, lines): for i,row in enumerate(fileob): if i25: - return self.column_to_alpha((column / 26) -1) + self.column_to_alpha(column % 26); + return self.column_to_alpha((old_div(column, 26)) -1) + self.column_to_alpha(column % 26); return o - + def write_row(self,row): ''' Writes a row as a SC file part ''' self.parse_row(row) - + def write_formats(self): - + for col in range(len(self.col_lengths)): precision="0" if self.col_types[col]=='float': @@ -117,7 +124,7 @@ class SCWriter: return True except: pass - return False + return False def is_int(self,string): try: @@ -125,7 +132,7 @@ class SCWriter: return True except: pass - return False + return False def is_num(self,string): @@ -149,12 +156,12 @@ class SCWriter: return num except: pass - + return string def setup_options(): ''' Setup the command line options ''' - + parser=ArgumentParser() parser.add_argument("-v","--version",action='version', version=__version__) parser.add_argument("-f",type=int,dest="precision",default=2, @@ -166,8 +173,8 @@ def setup_options(): parser.add_argument("tsv",type=str,action="store", help="TSV file to convert") options=parser.parse_args() - return options - + return options + if not which('sc'): print('You don\'t seem to have "sc" installed!') print('sudo apt-get install sc') diff --git a/tsv/tsvedit.py b/tsv/tsvedit.py index 3992591..bf15216 100755 --- a/tsv/tsvedit.py +++ b/tsv/tsvedit.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2014 Ville Rantanen # @@ -17,14 +17,21 @@ # '''SC based CSV editor.''' +from __future__ import division +from __future__ import print_function +from builtins import chr +from builtins import str +from builtins import range +from past.utils import old_div +from builtins import object __author__ = "Ville Rantanen" __version__ = "0.2" import sys,os import csv -from argparse import ArgumentParser +from argparse import ArgumentParser import unicodedata, re import subprocess import shutil @@ -46,14 +53,14 @@ def which(program): return None -class SCReader: +class SCReader(object): """ Class for reading SC files. - - """ + + """ def __init__(self,fileobject): self.file=fileobject self.parserre=re.compile('.* ([A-Z]+)([0-9]+) = (.*)') - + def _parse_row(self,string): col=None row=None @@ -64,14 +71,14 @@ class SCReader: row=self.try_int(m.group(2)) content=m.group(3) return col,row,content - + def try_int(self,string): - + try: return int(string) except: return string - + def alpha_to_column(self,alpha): ''' Returns a column number from spreadsheet column alphabet ''' n=0 @@ -80,28 +87,28 @@ class SCReader: o+=(ord(char.upper())-64)*(26**n) n+=1 return int(o-1) - - - def next(self): + + + def __next__(self): ''' Returns the next row in the table, three items: column, row, content''' - return self._parse_row(self.reader.next()) + return self._parse_row(next(self.reader)) def __iter__(self): for row in self.file: yield self._parse_row(row) -class SCWriter: +class SCWriter(object): """ Class for writing SC files. - - """ + + """ def __init__(self,fileobject): self.file=fileobject self.row=0 self.col=0 self.col_lengths=[] - + def parse_row(self,string): - + self.col=0 for el in row: self.write_element(self.row,self.col,el) @@ -111,34 +118,34 @@ class SCWriter: self.col_lengths[self.col]=max(len(el),self.col_lengths[self.col]) self.col+=1 self.row+=1 - + def write_element(self,row,col,content): - + colalpha=self.column_to_alpha(col) content=content.strip('"') - + if self.is_num(content): self.file.write('let '+colalpha+str(row)+' = ' + str(self.to_num(content))+'\n') else: self.file.write('rightstring '+colalpha+str(row)+' = "' + content + '"\n') - - + + def column_to_alpha(self,column): ''' Returns a column alphabet from column number ''' o=chr(column+64+1) if column>25: - return self.column_to_alpha((column / 26) -1) + self.column_to_alpha(column % 26); + return self.column_to_alpha((old_div(column, 26)) -1) + self.column_to_alpha(column % 26); return o - + def write_row(self,row): ''' Writes a row as a SC file part ''' self.parse_row(row) - + def write_formats(self): - + for col in range(len(self.col_lengths)): self.file.write('format '+self.column_to_alpha(col)+' '+str(self.col_lengths[col])+' 2 0\n') - + def is_num(self,string): ''' returns the True if string can be converted to number safely ''' try: @@ -152,7 +159,7 @@ class SCWriter: return True except: pass - + return False def to_num(self,string): @@ -168,12 +175,12 @@ class SCWriter: return num except: pass - + return string def setup_options(): ''' Setup the command line options ''' - + parser=ArgumentParser() parser.add_argument("-v","--version",action='version', version=__version__) parser.add_argument("-b",action="store_false",dest="backup",default=True, @@ -185,8 +192,8 @@ def setup_options(): parser.add_argument("tsv",type=str,action="store", help="TSV file to edit") options=parser.parse_args() - return options - + return options + def csv_write(screader,fileout): ''' writes a CSV from SCReader iterator ''' content=[] diff --git a/tsv/tsvkit.sh b/tsv/tsvkit.sh index b541c2e..effe73f 100644 --- a/tsv/tsvkit.sh +++ b/tsv/tsvkit.sh @@ -7,7 +7,7 @@ function c2t { # Convert comma separated stream in to tab separated stream # Usage: echo "foo,bar" | c2t - python -c 'import sys,csv + python3 -c 'import sys,csv try: csv.writer(sys.stdout, dialect=csv.excel_tab, lineterminator="\n").writerows(csv.reader(sys.stdin, dialect=csv.excel)) except IOError: @@ -15,15 +15,15 @@ except IOError: } function header { -# Print only the first line of input +# Print only the first line of input # Usage: header file.csv -# Usage: cat file.csv | header +# Usage: cat file.csv | header head -n 1 "$@" } function noheader { -# Strip first row of input +# Strip first row of input # Usage: noheader file.csv # Usage: cat file.csv | noheader @@ -33,7 +33,7 @@ function noheader { function tsvecho { # Echo with tab separated values, quoted # Usage: tsvecho value1 value2 "some value" > header.csv -# Usage: echo value1 value2 | tsvecho +# Usage: echo value1 value2 | tsvecho local HEAD [[ -t 0 ]] && { @@ -48,7 +48,7 @@ function tsvstrip { # Strip tsv of quotes # Usage: cat file.csv | tsvstrip - python -c 'import sys,csv + python3 -c 'import sys,csv try: csv.writer(sys.stdout, dialect=csv.excel_tab, quoting=csv.QUOTE_NONE).writerows(csv.reader(sys.stdin, dialect=csv.excel_tab)) except IOError: @@ -59,7 +59,7 @@ function tsvtranspose { # Transpose a tsv file # Usage: cat file.csv | tsvtranspose - python -c 'import sys,csv + python3 -c 'import sys,csv try: csv.writer(sys.stdout, dialect=csv.excel_tab, quoting=csv.QUOTE_NONE).writerows(map(None,*csv.reader(sys.stdin, dialect=csv.excel_tab))) except IOError: @@ -71,9 +71,9 @@ function tsvhead { # Usage: cat file | tsvhead -n 30 if [ -t 0 ]; then - python "${TSVDIR}"/lib/tsvhead "$@" + python3 "${TSVDIR}"/lib/tsvhead "$@" else - cat - | python "${TSVDIR}"/lib/tsvhead "$@" + cat - | python3 "${TSVDIR}"/lib/tsvhead "$@" fi } @@ -82,9 +82,9 @@ function tsvtail { # Usage: cat file | tsvtail -n 30 if [ -t 0 ]; then - python "${TSVDIR}"/lib/tsvtail "$@" + python3 "${TSVDIR}"/lib/tsvtail "$@" else - cat - | python "${TSVDIR}"/lib/tsvtail "$@" + cat - | python3 "${TSVDIR}"/lib/tsvtail "$@" fi } @@ -94,7 +94,7 @@ function tsvcut { # csvcut with tab-delimited dialect, see original script for options # Usage: tsvcut -c Col1,Col3 input1.tsv - + csvcut -t "$@" | c2t } @@ -102,7 +102,7 @@ function tsvformat { # csvformat with tab-delimited dialect, see original script for options # Usage: tsvformat -c Col2 -m searchString input1.tsv - + csvformat -t -T "$@" } @@ -110,7 +110,7 @@ function tsvgrep { # csvgrep with tab-delimited dialect, see original script for options # Usage: tsvgrep -c Col2 -m searchString input1.tsv - + csvgrep -t "$@" | c2t } @@ -118,7 +118,7 @@ function tsvjoin { # csvjoin with tab-delimited dialect, see original script for options # Usage: tsvjoin -c 1,1 input1.tsv input2.tsv - + csvjoin -t "$@" | c2t } @@ -126,7 +126,7 @@ function tsvlook { # csvlook with tab-delimited dialect, see original script for options # Usage: tsvlook file1.tsv - + csvlook -t "$@" } @@ -147,8 +147,8 @@ function tsvquery { When defining a database with -d it is kept, and can be inserted with more data later. Otherwise the DB is created in /tmp/ and deleted afterwards. - If not using name=data.tsv syntax, tables are named tsv1, tsv2... - Note: You have to give an SQL query. If you just want to + If not using name=data.tsv syntax, tables are named tsv1, tsv2... + Note: You have to give an SQL query. If you just want to populate a database, add " " as an empty query. ' return 0 @@ -167,7 +167,7 @@ function tsvquery { # Add table with unique numbering local OLDTBLS=$( sqlite3 "$DBTEMP" ".tables" ) local TBLNO=1 - while : + while : do echo $OLDTBLS | grep tsv$TBLNO > /dev/null || break TBLNO=$(( $TBLNO + 1 )) done @@ -178,7 +178,7 @@ function tsvquery { local FIL TBL=$( echo ${!i} | sed 's,=.*,,' ) FIL=$( echo ${!i} | sed "s,^$TBL=,," ) - [ -f "$FIL" ] && { + [ -f "$FIL" ] && { cat "$FIL" | csvsql -t --db "sqlite:///$DBTEMP" --insert --table "$TBL" } || { echo File "${!i}" not found @@ -191,7 +191,7 @@ function tsvquery { local EC=$? # remove DB if using temporary [ -z "$j" ] && { - rm -f "$DBTEMP" + rm -f "$DBTEMP" } return $EC } @@ -200,7 +200,7 @@ function tsvsort { # csvsort with tab-delimited dialect, see original script for options # Usage: tsvsort -c Col3 input.tsv - + csvsort -t "$@" | c2t } @@ -208,7 +208,7 @@ function tsvstack { # csvstack with tab-delimited dialect, see original script for options # Usage: tsvstack file1.tsv file2.tsv - + csvstack -t "$@" | c2t } @@ -240,9 +240,9 @@ function tsvfold { function tsvdims { # Print dimensions of a TSV # Usage: tsvdims file.txt -# Usage: cat file.txt | tsvdims +# Usage: cat file.txt | tsvdims - python -c 'import sys,csv + python3 -c 'import sys,csv if sys.argv[1]=="": input=sys.stdin else: diff --git a/tsv/tsvplot.py b/tsv/tsvplot.py index b923f94..760522e 100755 --- a/tsv/tsvplot.py +++ b/tsv/tsvplot.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # # Copyright 2016 Ville Rantanen # @@ -16,8 +16,10 @@ # along with this program. If not, see . # from __future__ import print_function +from __future__ import division +from past.utils import old_div import sys, os, math, csv, subprocess -from argparse import ArgumentParser +from argparse import ArgumentParser '''Plot CSV files with GNUPLOT.''' __author__ = "Ville Rantanen" @@ -29,7 +31,7 @@ def get_data_scatter(opts): try: for row in reader: data.append(",".join([row[c] for c in opts.columns])) - except KeyError,ME: + except KeyError as ME: print("Column {} not found.".format(ME),file=sys.stderr) print("Columns in the file:"+",".join(reader.fieldnames),file=sys.stderr) sys.exit(1) @@ -45,12 +47,12 @@ def get_data_histogram(opts): data.append(row[opts.columns[0]]) except ValueError: continue - except KeyError,ME: + except KeyError as ME: print("Column {} not found.".format(ME),file=sys.stderr) print("Columns in the file:"+",".join(reader.fieldnames),file=sys.stderr) sys.exit(1) return "\n".join(data) - + def get_stats(opts): reader=csv.DictReader(open(os.path.join(*opts.csv),'rb'), dialect=csv.excel_tab, lineterminator="\n") values_min=float('nan') @@ -65,13 +67,13 @@ def get_stats(opts): values_n+=1 values_min=min(f,values_min) values_max=max(f,values_max) - except KeyError,ME: + except KeyError as ME: print("Column {} not found.".format(ME),file=sys.stderr) print("Columns in the file:"+",".join(reader.fieldnames),file=sys.stderr) sys.exit(1) return (values_min,values_max,values_n) - -def get_plotterm(opts): + +def get_plotterm(opts): if opts.X11: plotterm="" else: @@ -95,9 +97,9 @@ def get_histogram_template(opts): (height,width)=termsize() if opts.width: width=opts.width - bins=min(int(float(width)/4),bins) + bins=min(int(old_div(float(width),4)),bins) template='''{} -set datafile separator ","; +set datafile separator ","; set xlabel '{}'; Min = {}; Max = {}; @@ -119,8 +121,8 @@ plot '20: twocol=True @@ -115,7 +115,7 @@ def read_displays(): pass return entries - + def append_index(entries,offset=0,color=None): e=1+offset for el in range(len(entries)): @@ -138,7 +138,7 @@ def initialize(): entries=read_displays() entries=append_index(entries,offset=0,color=bc.CYA) return entries - + def main(): arg_input=None if (len(sys.argv)>1): diff --git a/web/droopy b/web/droopy index b350e56..11429f7 100755 --- a/web/droopy +++ b/web/droopy @@ -1,5 +1,5 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- # Droopy (http://stackp.online.fr/droopy) # Copyright 2008-2012 (c) Pierre Duquesne @@ -52,8 +52,12 @@ # * German translation by Michael. # 20080408 * First release. -import BaseHTTPServer -import SocketServer +from __future__ import print_function +from future import standard_library +standard_library.install_aliases() +from builtins import str +import http.server +import socketserver import cgi import os import posixpath @@ -67,10 +71,10 @@ import shutil import tempfile import socket import locale -import urllib +import urllib.request, urllib.parse, urllib.error LOGO = '''\ - _____ + _____ | \.----.-----.-----.-----.--.--. | -- | _| _ | _ | _ | | | |_____/|__| |_____|_____| __|___ | @@ -88,10 +92,10 @@ Options: --dl provide download links --save-config save options in a configuration file --delete-config delete the configuration file and exit - + Example: droopy -m "Hi, this is Bob. You can send me a file." -p avatar.png -''' +''' picture = None message = "" @@ -200,7 +204,7 @@ function update() { } function onunload() { document.getElementById("form").style.display = "block"; - document.getElementById("sending").style.display = "none"; + document.getElementById("sending").style.display = "none"; } @@ -256,7 +260,7 @@ errortmpl = ''' ''' + userinfo + ''' -''' +''' linkurltmpl = '''
%(discover)s @@ -611,7 +615,7 @@ class DroopyFieldStorage(cgi.FieldStorage): return self.tmpfile -class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): +class HTTPUploadHandler(http.server.BaseHTTPRequestHandler): protocol_version = 'HTTP/1.0' form_field = 'upfile' @@ -624,9 +628,9 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): page can be "main", "success", or "error" returns an html page (in the appropriate language) as a string """ - + # -- Parse accept-language header - if not self.headers.has_key("accept-language"): + if "accept-language" not in self.headers: a = [] else: a = self.headers["accept-language"] @@ -638,11 +642,11 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): a.reverse() a = [x[1] for x in a] # now a is an ordered list of preferred languages - + # -- Choose the appropriate translation dictionary (default is english) lang = "en" for l in a: - if translations.has_key(l): + if l in translations: lang = l break dico = copy.copy(translations[lang]) @@ -665,7 +669,7 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): if names: for name in names: links += '%s
' % ( - urllib.quote(name.encode('utf-8')), + urllib.parse.quote(name.encode('utf-8')), name) links = '
' + links + '
' dico["files"] = links @@ -682,7 +686,7 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_GET(self): name = self.path.lstrip('/') - name = urllib.unquote(name) + name = urllib.parse.unquote(name) name = name.decode('utf-8') if picture != None and self.path == '/__droopy/picture': @@ -701,7 +705,7 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): # Do some browsers /really/ use multipart ? maybe Opera ? try: self.log_message("Started file transfer") - + # -- Set up environment for cgi.FieldStorage env = {} env['REQUEST_METHOD'] = self.command @@ -714,25 +718,25 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): form = DroopyFieldStorage(fp = self.rfile, environ = env); fileitem = form[self.form_field] realname="" - if self.form_realname in form.keys(): + if self.form_realname in list(form.keys()): realname = form[self.form_realname].value.decode('utf-8') if realname=="": filename = self.basename(fileitem.filename).decode('utf-8') else: self.log_message("Got realname: %s", realname) filename=self.basename(realname) - + if filename == "": self.send_response(303) self.send_header('Location', '/') self.end_headers() return - + localpath = os.path.join(directory, filename).encode('utf-8') root, ext = os.path.splitext(localpath) i = 1 # race condition, but hey... - while (os.path.exists(localpath)): + while (os.path.exists(localpath)): localpath = "%s-%d%s" % (root, i, ext) i = i+1 if hasattr(fileitem, 'tmpfile'): @@ -757,7 +761,7 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): else: self.send_html(self.html("success")) - except Exception, e: + except Exception as e: self.log_message(repr(e)) self.send_html(self.html("error")) @@ -792,7 +796,7 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): if publish_files: # os.listdir() returns a list of unicode strings when the # directory is passed as an unicode string itself. - names = [name for name in os.listdir(unicode(directory)) + names = [name for name in os.listdir(str(directory)) if os.path.isfile(os.path.join(directory, name)) and not name.startswith(DroopyFieldStorage.TMPPREFIX)] names.sort() @@ -802,8 +806,8 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): def handle(self): try: - BaseHTTPServer.BaseHTTPRequestHandler.handle(self) - except socket.error, e: + http.server.BaseHTTPRequestHandler.handle(self) + except socket.error as e: self.log_message(str(e)) raise Abort() @@ -811,14 +815,14 @@ class HTTPUploadHandler(BaseHTTPServer.BaseHTTPRequestHandler): class Abort(Exception): pass -class ThreadedHTTPServer(SocketServer.ThreadingMixIn, - BaseHTTPServer.HTTPServer): +class ThreadedHTTPServer(socketserver.ThreadingMixIn, + http.server.HTTPServer): def handle_error(self, request, client_address): # Override SocketServer.handle_error exctype = sys.exc_info()[0] if not exctype is Abort: - BaseHTTPServer.HTTPServer.handle_error(self,request,client_address) + http.server.HTTPServer.handle_error(self,request,client_address) # -- Options @@ -858,7 +862,7 @@ def save_options(): f.write('\n'.join(opt).encode('utf8')) f.close() - + def load_options(): try: f = open(configfile()) @@ -867,7 +871,7 @@ def load_options(): parse_args(cmd) f.close() return True - except IOError, e: + except IOError as e: return False @@ -883,7 +887,7 @@ def parse_args(cmd=None): lang, encoding = locale.getdefaultlocale() if encoding != None: cmd = [a.decode(encoding) for a in cmd] - + opts, args = None, None try: opts, args = getopt.gnu_getopt(cmd, "p:m:d:h", @@ -891,8 +895,8 @@ def parse_args(cmd=None): "directory=", "help", "save-config","delete-config", "dl"]) - except Exception, e: - print e + except Exception as e: + print(e) sys.exit(1) for o,a in opts: @@ -904,7 +908,7 @@ def parse_args(cmd=None): elif o in ['-d', '--directory']: directory = a - + elif o in ['--save-config']: must_save_options = True @@ -912,16 +916,16 @@ def parse_args(cmd=None): try: filename = configfile() os.remove(filename) - print 'Deleted ' + filename - except Exception, e: - print e + print('Deleted ' + filename) + except Exception as e: + print(e) sys.exit(0) elif o in ['--dl']: publish_files = True elif o in ['-h', '--help']: - print USAGE + print(USAGE) sys.exit(0) # port number @@ -929,11 +933,11 @@ def parse_args(cmd=None): if args[0:]: port = int(args[0]) except ValueError: - print args[0], "is not a valid port number" + print(args[0], "is not a valid port number") sys.exit(1) -# -- +# -- def run(): """Run the webserver.""" @@ -944,25 +948,25 @@ def run(): if __name__ == '__main__': - print LOGO + print(LOGO) config_found = load_options() parse_args() if config_found: - print 'Configuration found in %s' % configfile() + print('Configuration found in %s' % configfile()) else: - print "No configuration file found." - + print("No configuration file found.") + if must_save_options: save_options() - print "Options saved in %s" % configfile() + print("Options saved in %s" % configfile()) - print "Files will be uploaded to %s" % directory + print("Files will be uploaded to %s" % directory) try: - print - print "HTTP server running... Check it out at http://localhost:%d"%port + print() + print("HTTP server running... Check it out at http://localhost:%d"%port) run() except KeyboardInterrupt: - print '^C received, shutting down server' + print('^C received, shutting down server') # some threads may run until they terminate diff --git a/web/ftpserver b/web/ftpserver index 2b31874..22b7df9 100755 --- a/web/ftpserver +++ b/web/ftpserver @@ -1,8 +1,8 @@ #!/bin/sh -python -c "import pyftpdlib" >/dev/null 2>&1 || { +python3 -c "import pyftpdlib" >/dev/null 2>&1 || { echo "pyftpdlib is not installed:" - echo " pip install --user pyftpdlib" - exit + echo " pip3 install --user pyftpdlib" + exit } -python -m pyftpdlib "$@" +python3 -m pyftpdlib "$@"