Показаны сообщения с ярлыком Python. Показать все сообщения
Показаны сообщения с ярлыком Python. Показать все сообщения

26 июл. 2016 г.

Python и DBF

Собственно стояла задача подружить Python и dbf-файл.

#!/usr/bin/env python
# -*- coding: utf8 -*-

import dbf

table = dbf.Table("table1.dbf", codepage='cp866')
table.open('read-only')

print table

for i in table:
print i.f1, i.f3.encode('utf8')

table.close()


Получал множество сообщений вида:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

Пробовал decode/encode и т.п., пока не залез в руководство и не нашел там фразу о codepage.

9 сент. 2013 г.

Python with SNMP

Копипаст с laa88.blog.ru:
Пропарился полтора дня с попыткой свящать snmp и python'а.
Сначала пробовал PySNMP — не получилось. При запуске программы орет на пропущенные скобки, хотя все на месте.
Позже пробовал twistedsnmp — такая же проблема где-то пропущена закрывающаяся скобка и программа не запускается.
Отчаявшись — решил собрать библиотеку дла python'а из Net-snmp. При выполнении
python python.sh build
выдается более 20000 строк об ошибках и сообщение, что 'cc' имеет ошибки.
И тут, покапавшись в портах, нахожу программку с невзрачным названием yapsnmp (как позже оказалось это абривеатура). Установка прошла гладко. Но смутил пример автора для выполнения запроса:
yapsnmp.Session('router45-ny').walk('system')
Проблема была в следующем - т.к. у меня все мои девайсы используют разные версии snmp, то в примере автора не было указано ни версии протокола, ни комьюнити. Открыв доки - тоже не нашел ничего внятного, кроме того, что было в общих чертах указано что они могут быть. Попарился немного и... о чудо!!! Программа заработала. Вот так все будет 100% работать:
import yapsnmp print yapsnmp.Session('10.10.1.1', version=2, community='public').walk('ifOperStatus')
А вот, собственно, вывод:
(('ifOperStatus.1', 'up'), ('ifOperStatus.2', 'up'), ('ifOperStatus.3', 'down'), ('ifOperStatus.4', 'down'), ('ifOperStatus.5', 'down'), ('ifOperStatus.6', 'down'), ('ifOperStatus.7', 'down'), ... ,('ifOperStatus.50', 'down'), ('ifOperStatus.51', 'down'), ('ifOperStatus.52', 'up'))

Думаю, что кому-то пригодится.

1 авг. 2012 г.

Генератор паролей на python

От нечего делать написал генератор сложных паролей.


#!/usr/bin/python 
# -*- coding: utf-8 —*- 

import sys 
import random 

# Функция генерации пароля. 
def generator(x): 
 s = '' 
 if (x  > 0): 
  for i in range(1, x+1): 
   rnd = random.randint(33, 126) 
   s += chr(rnd) 
 else: 
  return 0 
 return s 


arg = sys.argv 
arg.pop(0) 
argc = len(arg) 
flags = ['-n', '-s'] 
if argc != 0: 
 for x in arg: 
  if x in flags: 
   ind = arg.index(x) 
   param = arg[ind+1] 
   if x == '-n': 
    print generator(int(param)) 
   elif x == '-s': 
    print ind, param 




Программка сырая, но пока что справляется со своим прямым назначением. Вот пример:
administrator@HP:~/prj/py/passgen$ ./gen.py —n 16
&FP@-&7x,eHuy~9q

python ASCII


Столкнулся с задачей получения ascii-кода символа и символа по ascii-коду.
Решение:

Получаем символ по коду:
chr(97)
Результатом будет строка 'a'.


Получаем код символа:
ord('a')
Результатом будет число 97.


Так же есть такая инструкция:
chr(ord('a') + 2)
Результатом будет строка 'c'.


Unicode:
Получаем символ:
unichr(97)

Результатом будет unicode-строка: u'a' 

Простейший клиент и сервер на python (документация)

Сервер:

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
The RequestHandler class for our server.

It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""

def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "%s wrote:" % self.client_address[0]
print self.data
# just send back the same data, but upper-cased
self.request.send(self.data.upper())

if __name__ == "__main__":
HOST, PORT = "localhost", 9999

# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()

Клиент:
import socket
import sys

HOST, PORT = "localhost", 9999
data = " ".join(sys.argv[1:])

# Create a socket (SOCK_STREAM means a TCP socket)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect to server and send data
sock.connect((HOST, PORT))
sock.send(data + "\n")

# Receive data from the server and shut down
received = sock.recv(1024)
sock.close()

print "Sent: %s" % data
print "Received: %s" % received

Соответственно расстарляем табуляцию.

Простейший вэб сервер на Python


python -m SimpleHTTPServer


Запустит простейший вэб-сервер на Python'е. Считаю полезным для быстрого доступа к собственной машине.
Внимание. Корнем сервера будет считаться pwd директория, в которой выполняется команда.

Python + MySQL. Работа с кириллицей.

Столкнулся с проблемой выбора кириллических записей из БД mysql. Проблема заключалась в том, что при выборе я получал вместо русских букв знаки вопроса. Вопрос решился чтением мануала. Решение получил такое:


#!/usr/bin/env python
# -*- coding: koi8-r -*-

Код программы с получением данных из MySQL:

import MySQLdb

local = MySQLdb.connect (host = "localhost", user = "root", passwd = "root_passwd", db = "mydb", charset = "koi8r", use_unicode = False)

local_cursor = local.cursor (MySQLdb.cursors.DictCursor)
local_cursor.execute ("SELECT * FROM my_table")

result_set_local = local_cursor.fetchall ()
for local_row in result_set_local:
  print str(local_row['russian'])

# -*- coding: koi8-r —*- - следует использовать для вывода результата в консоль.

Python. Curses


Поискав в инете инфу о curses в языке си и python — ничего толкового не нашел. Нашел только кривой мануал на офф сайте питона, да и тот тоже не особо ровный — прыжки с места на место. Решил как и всегда, написать свое объяснение curses «как для себя». Я попрежнему пишу на 2,6 версии.
Задача — вывести цветной текст в терминал.
Вот такое решение получаю.


#!/usr/local/bin/python

#Подключаем модуль curses, с которым, собственно, и работаем

import curses

#Подключаем модуль times, нужен только в конце скрипта для задержки на выход.
import time

#инициалищируем работу с экраном.
stdscr = curses.initscr()

# отключаем отображение курсора в терминале. см. описание ниже.
curses.curs_set(0)

#разрешаем работу с цветом.
curses.start_color()

#Объявляем, так называемую, палитру цветов.

#Палитра состоит из идентификационного номера, цвет текста, цвет фона

curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)

# просто описанная переменная, хотел проверить вывод значений в следующей процедуре.

a = 1

# процедура выводит строку (и только строку). Строка начнется в координате x=10 и y=10 знакомест. Текст будет окрашен в палитру 1.
stdscr.addstr(10,10, str(a), curses.color_pair(1))

#Обновляем то, что написали.

stdscr.refresh()

#Делаем задержку перед выходом из программы "чтобы посмотреть"
time.sleep(3)





#Возвращаем стандартное отображение курсора.
curses.curs_set(1)

Доступные цвета:

# black 0
# red 1
# green 2
# yellow 3
# blue 4
# magenta 5
# cyan 6
# white 7

хотя даже в доке сказано, что лучше пользовать их через переменные модуля curses — curses.COLOR_BLACK или curses.COLOR_WHITE.

curses.curs_set(значение) - позваляет управлять отображением курсора ввода с клавиатуры в терминале. Можно использовать следующие значения:
0 — скрыть курсор.
1 — стандартный курсор.
2 — непрозрачный курсор.
Следует отметить, что если не вернуть стандартный курсор по окончании программы, то могут возникнуть некоторые трудности при работе в терминале (не отображаемый курсор или непрозрачный курсор).

Python + telnet

Столкнулся с проблемой организации telnet из python'а. Казалось бы, что проще — подключил библиотеку telnetlib и пользуйся? Однако не все так просто. В примерах, которые приведены на сайтах разработчиков и официальном сайте, при вводе логина/пароля и передаче команд используется символ \n (якобы для эмулирования нажатия клавиши enter), однако этот пример не работает у меня и нужно использовать "\r». Поясню почему. В документации говорится, что "\n» - символ перехода на новую строку с внутренним кодом 0x0A, а "\r» - символ возврата каретки с внутренним кодом 0x0D. Получается, что устройства, к которым я пытался подключиться отлавливают именно 0x0D, а 0x0A просто добавляли вконец написанной строки. В итоге код получился таким:


#!/usr/bin/env python
import sys
import telnetlib
import time


tn = telnetlib.Telnet("10.10.0.1", 23) #подключаемся к узлу 

tn.read_until("Router  >") # отлавливаем приглашение, которое заканчивается "Router  >"
tn.write("enable\r") # вводим команду (Обратить внимание на \r)

tn.read_until("Password:") #отлавливаем приглашение с вводом пароля
tn.write("my_pass\r") # вставляем пароль (Обратить внимание на \r)

tn.read_until("telnet@BigIron Router#") #отлавливаем приглашение, информирующее о входе в систему
tn.write("show chassis\r") # выполняем команду
s = tn.read_until(" C degrees") # считываем результат до определенного слова

print type(s) #навсякий случай узнаем что мы получили, а то мало ли

tn.close(); #закрываем сессию
print s # выводим полученный результат.