#1 Le 29/12/2009, à 15:46
- UUBBUU_USER
Aide a la réalisation d'un script Python
Merci Pour toutes remarques, corrections ou autres .. au sujet de ce script:
Je suis débutant en python ( et en programmation d'ailleurs) .. donc ... soyez indulgents svp !!!
Voiçi déja l'apercu de mes volontés .. sans vraiment être sur des possibilités
Au vu des plusieurs posts sur la commande "python -m SimpleHTTPServer" .. Je me suis décider a commencer un petit script en python .. afin de réaliser un gui qui permetrait de lancer et gérer la fonction :
MAis au cours de mes recherches j'ai découvert pyftplib .. ( http://code.google.com/p/pyftpdlib/)
librairie entièrement dédier a la gestion d'un serveur FTP ...
Il est vrai .. qu'étant une librairie a ajouter ... on perd la simplicité de cette fameuse commande ...
Mais a la recherche d'un système de QOS et divers autre paramètres propre a un ftp .. cela m'a parut le moyen le plus simple pour arriver a mes fins sans prise de tête ...
Je vous renvoie au site pour tous les renseignements ...
TODO:
1) choisir entre python-notify et notify-bin
2) affiner la fenetre de creation du server
3) creer les def pour start et stop server dans la class gtk-launcher-server
4) Recup le Pid du server créé
5) lier def start et class server
6) rajouter icone et main
7) creer main avec listing des serveur en routes
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
scripts trouver sur la fonction SIMPLEHTTPSERVER:
import SimpleHTTPServer
import SocketServer
# web server minimal. Les fichiers du serveur sont organisé de manière relatif au répertoire courant.
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serveur sur le port", PORT
httpd.serve_forever()
source du code : http://www.style-python.eu/Wiki/index.p … HTTPServer.
------------------------------------------------------------------
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import SocketServer
import BaseHTTPServer
import sys, os
import CGIHTTPServer
port = 8000
class ThreadingCGIServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass
server = ThreadingCGIServer(('', port), CGIHTTPServer.CGIHTTPRequestHandler)
print "Serveur demarre sur le port %s." % port
try:
while 1:
sys.stdout.flush()
server.handle_request()
except KeyboardInterrupt:
print "Fini !"
( version multithreadé ??????????)
source :http://www.crashdump.fr/reseaux/serveur … ligne-649/
------------------------------------------------------------------
+ simple .. l'option -m permetrait a elle seule de spécifier le port :
python -m SimpleHTTPServer 9000
Par exemple ouvre le serveur sur le port 9000 ....
source : http://www.linuxjournal.com/content/tec … ver-python
possibilité d'ouvrir plusieurs instances en modifiant le n° du port .. et le dossier d'ou on lance la commande
------------------------------------------------------------------
Exemple de script similaire mais en ligne de commande par le célèbre Xyne mais plus complet ( password .. utilisateur ... )(http://xyne.archlinux.ca/)
source : http://bbs.archlinux.org/viewtopic.php?id=85751&p=1
------------------------------------------------------------------
Me Manque toujours le moyen de contrôler la bande passante par le PID ou même le Port ..
Bien que trickle fonctionne .. il serait plus approprié de pouvoir contrôler a la manière de wget ( pour l'upload bien sur )
--------------------------
on peut créer un fichier index.html "type" stocké dans le dossier du script , modifiable par l'utilisateur, qui sera copié et supprimé au début et à la fermeture du serveur
oubien créer a la volée ( exemple source :http://perso.telecom-paristech.fr/~durrieu/utils/ls.py)
#!/usr/bin/python
# -*- coding: latin-1 -*-
# cree un fichier html d'index contenant tous les fichiers d'un repertoire donne. Non recursif.
import string,commands,os
# commands.getouput("ls") récupère le résultat de la commande shell "ls",
# en tant que chaine de caractères "toto\ntiti" par exemple,
# et cette chaine sera découpée en utilisant "\n" comme séparateur
# afin de récupérer les noms des fichiers dans "liste"
# qui est alors un vecteur genre ['toto','titi']
liste=string.split(commands.getoutput("ls"))
file = open('index.html','w')
file.write('This is an index html file automatically generated by a python script. <br>\n\n')
for name in liste :
file.write('<a href=')
file.write(name)
file.write('>')
file.write(name)
file.write('</a><br>\n')
Dernière modification par UUBBUU_USER (Le 27/02/2010, à 18:32)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#2 Le 29/12/2009, à 15:46
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Lanceur GTK du serveur :
##------------------------------------------------------------------------------------------------------------------------------------
####-----------GTK LAUNCH SERVER------------
class gtk_launch_server ():
def __init__(self):
logINFO('** create window gtk_launch_server..')
##---------CREATION FENETRE-------------------------------------
self.window = gtk.Window()
self.window.set_title(APP_NAME)
self.window.set_name("%sWindow" % APP_NAME)
self.window.set_keep_below(False)
self.window.set_keep_above(True)
self.window.set_skip_taskbar_hint(True)
self.window.connect("destroy", doquit)
##---------CONTENU-------------------------------
# boite generale
main_box = gtk.VBox(False,4)
# titre server
LABEL_ = gtk.Label()
LABEL_.set_markup("<b>SERVER</b>")
# SHARE DIRECTORY
HBOX_server_dir = gtk.HBox(False, 3)
LABEL_DIR = gtk.Label("Share-Dir : ")
self.server_dir = gtk.Entry()
bt_select_dir = gtk.Button("choose Dir")
bt_select_dir.connect("clicked", self.dir_chooser)
HBOX_server_dir.pack_start(LABEL_DIR)
HBOX_server_dir.pack_start(self.server_dir)
HBOX_server_dir.pack_end(bt_select_dir)
# PORT NUMBER
HBOX_server_port = gtk.HBox(False, 2)
LABEL_PORT = gtk.Label("Port-Number : ")
adj_port = gtk.Adjustment(value=21, lower=0, upper=65535, step_incr=1, page_incr=25, page_size=0)
server_port = gtk.SpinButton(adjustment=adj_port, climb_rate=0.0, digits=0)
HBOX_server_port.pack_start(LABEL_PORT)
HBOX_server_port.pack_start(server_port)
# UPLOAD LIMIT
HBOX_upload_limit = gtk.HBox(False, 3)
LABEL_UPLOAD = gtk.Label("Upload-Limit : ")
adj_up = gtk.Adjustment(value=30, lower=0, upper=1000, step_incr=1, page_incr=25, page_size=0)
server_upload_limit = gtk.SpinButton(adjustment=adj_up, climb_rate=0.0, digits=0)
LABEL_kb_s = gtk.Label(" kb/second")
HBOX_upload_limit.pack_start(LABEL_UPLOAD)
HBOX_upload_limit.pack_start(server_upload_limit)
HBOX_upload_limit.pack_start(LABEL_kb_s)
# DOWNLOAD LIMIT
HBOX_download_limit = gtk.HBox(False, 3)
LABEL_DOWNLOAD = gtk.Label("Download-Limit : ")
adj_dl = gtk.Adjustment(value=30, lower=0, upper=1000, step_incr=1, page_incr=25, page_size=0)
server_download_limit = gtk.SpinButton(adjustment=adj_dl, climb_rate=0.0, digits=0)
LABEL_kb_s = gtk.Label(" kb/second")
HBOX_download_limit.pack_start(LABEL_DOWNLOAD)
HBOX_download_limit.pack_start(server_download_limit)
HBOX_download_limit.pack_start(LABEL_kb_s)
# boite boutons
HBOX_buttons = gtk.HBox(False, 4)
bt_start_server = gtk.Button("start server")
bt_stop_server = gtk.Button("stop server")
bt_close_launcher = gtk.Button("close launcher")
bt_close_launcher.connect("clicked", self.close_launcher)
HBOX_buttons.pack_start(bt_start_server)
HBOX_buttons.pack_start(bt_stop_server)
HBOX_buttons.pack_start(bt_close_launcher)
##----------INIT FENETRE------------------------------------------
main_box.pack_start(LABEL_)
main_box.pack_start(HBOX_server_dir)
main_box.pack_start(HBOX_server_port)
main_box.pack_start(HBOX_upload_limit)
main_box.pack_start(HBOX_download_limit)
main_box.pack_start(HBOX_buttons)
main_box.show_all()
self.window.add(main_box)
self.window.show()
####------------------------------------DEF CHOOSE DIRECTORY
def dir_chooser(self,widget):
logINFO('** dir_chooser ..')
dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_OK, gtk.RESPONSE_OK,gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), None)
dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
dialogue.set_current_folder(os.environ['HOME'])
if dialogue.run() == gtk.RESPONSE_OK:
self.server_dir.set_text(dialogue.get_current_folder())
print dialogue.get_current_folder()
dialogue.destroy()
####------------------------------------DEF close Launcher
def close_launcher(self, widget=None, data=None):
logINFO('** close launcher ..')
gtk.main_quit()
####------------------------------------DEF start server
def start_server_ ():
logINFO('** start server ..')
####------------------------------------DEF stop server
def start_server_ ():
logINFO('** stop server ..')
#--------------------------------------------------------------------------------------------------------------------------------------------------------------
Dernière modification par UUBBUU_USER (Le 27/02/2010, à 18:46)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#3 Le 01/01/2010, à 17:57
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
voila le script du server :
sys.argv = ["pyftpdlib_ftp.py", "-s", self.server_dir, "-p", server_port, "-u", server_upload_limit, "-d", server_download_limit ]
Get_ARGV__ = optparse.OptionParser(usage='Usage: %prog <options> <arg> ..')
#---------------------------GROUP OPTION CREDIT
Get_ARGV__GROUP_CREDIT = optparse.OptionGroup(Get_ARGV__, "CREDIT ", """FTP server base on pyftpdlib
Site Web :http://code.google.com/p/pyftpdlib""")
Get_ARGV__.add_option_group(Get_ARGV__GROUP_CREDIT)
#---------------------------GROUP OPTION GENERAL
Get_ARGV__GROUP_SERVER = optparse.OptionGroup(Get_ARGV__, "GENERAL OPTIONS", "General FTP Options.")
Get_ARGV__GROUP_SERVER.add_option("-s", dest="SHARE_DIR", default=os.path.expanduser('~'), help="""Share directory
DefaultValue: USER directory""")
Get_ARGV__GROUP_SERVER.add_option("-p", dest="PORT_NUMBER", default="21", help="""Server Port Number
DefaultValue: %default""")
Get_ARGV__.add_option_group(Get_ARGV__GROUP_SERVER)
#---------------------------GROUP OPTION THROTTLED BANDWITCH
Get_ARGV__GROUP_SPEED = optparse.OptionGroup(Get_ARGV__, "THROTTLED OPTIONS ","""Upload and Download limit
Exemple : 30720 = 30 Kb/sec (30 x 1024)""")
Get_ARGV__GROUP_SPEED.add_option("-u", dest="UP_LIMIT", default="30270", help="""UpStream Limit
DefaultValue: %default""")
Get_ARGV__GROUP_SPEED.add_option("-d", dest="DOWN_LIMIT", default="30270",help="""DownStream Limit
DefaultValue: %default""")
Get_ARGV__.add_option_group(Get_ARGV__GROUP_SPEED)
( options, args ) = Get_ARGV__.parse_args()
if len(sys.argv[1:])<1:
Get_ARGV__.error("Not enought arguments. Try with -h or --help options for more info.")
print " Server Will be launch With those options : "
print "Share directory :", options.SHARE_DIR
print "Port number :", options.PORT_NUMBER
print "UpStream limit :", options.UP_LIMIT
print "DownStream limit :", options.DOWN_LIMIT
SHARE_DIR = options.SHARE_DIR
PORT_NUMBER = options.PORT_NUMBER
UP_LIMIT = options.UP_LIMIT
DOWN_LIMIT = options.DOWN_LIMIT
USER = "user"
PASSWORD = "password"
#~ # Instantiate a dummy authorizer for managing 'virtual' users
authorizer = ftpserver.DummyAuthorizer()
#~ # Define a new user having full r/w permissions
authorizer.add_user(USER, PASSWORD , SHARE_DIR, perm='elradfmw')
#~ # define an anonymous user with read-only (comment or uncomment)
authorizer.add_anonymous(SHARE_DIR)
#~ # define bandwitch limit
dtp_handler = ftpserver.ThrottledDTPHandler
dtp_handler.read_limit = UP_LIMIT
dtp_handler.write_limit = DOWN_LIMIT
#~ # Instantiate FTP handler class
ftp_handler = ftpserver.FTPHandler
ftp_handler.authorizer = authorizer
#~ # have the ftp handler use the alternative dtp handler class
ftp_handler.dtp_handler = dtp_handler
#~ # Instantiate FTP server class and listen to 0.0.0.0:DEFAULT_PORT
ftpd = ftpserver.FTPServer(('0.0.0.0', PORT_NUMBER), ftp_handler)
#~ # set a limit for connections
ftpd.max_cons = 256
ftpd.max_cons_per_ip = 5
ftpd.serve_forever()
Dernière modification par UUBBUU_USER (Le 27/02/2010, à 22:41)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#4 Le 03/01/2010, à 16:12
- l e . n o x
Re : Aide a la réalisation d'un script Python
Bonjour UUBBUU_USER, je m'abonne à ton post
Et du coup un petit "UP", bonne continuation ....
Zik Fan : " Vous seul savez mieux que quiconque comment organiser votre bibliothèque musicale ! "
Linux, y a moins bien.
Mais c'est plus cher. ;O)
Hors ligne
#5 Le 04/01/2010, à 14:24
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
j'avance pas a pas et a mon rythme .. merci du soutien le.nox ...
Par contre je mets mon script a jour direct en éditant le deuxième message .. donc pas sur qu'il s' up ou soit vu si façilement .. Remarque abonné .. tu peux y venir plus facilement .
Sinon A tous ... toutes remarques, corrections ou conseil sont les bienvenus ( j'ai quelques erreurs dans le script )
-------------------------------------------------------------------------------------------------
découvert lors de mes recherches .. nouvelle librairie :
About
Python FTP server library provides a high-level portable interface to easily write asynchronous FTP servers with Python.
pyftpdlib is currently the most complete RFC-959 FTP server implementation available for Python programming language.
It is used in projects like Google Chromium and Bazaar and included in Linux Fedora and FreeBSD package repositories.
possibilité énorme ... . ptêt encore mieux que SimpleHTTPServer
Dernière modification par UUBBUU_USER (Le 04/01/2010, à 16:15)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#6 Le 04/01/2010, à 15:47
- ADcomp
Re : Aide a la réalisation d'un script Python
salut ..
Regarde si ces qques lignes peuvent t'aider à avancer ( pas de gestion du serveur )
#!/usr/bin/python
# -*- coding: utf-8 -*-
##
# This program is distributed under the terms of the GNU General Public License
# For more info see http://www.gnu.org/licenses/gpl.txt
##
import os
try:
import gtk
except:
print("ERROR - Install PyGTK ( GTK+ for Python )")
exit()
APP_NAME = 'NOM_DU_PROGRAMME'
APP_VERSION = '0.1'
APP_DESC = 'blabla, blbalblallaaa blabla ...'
## True / False ( only for debbuging )
DEBUG=True
def logINFO(msg):
if DEBUG:
print("%s - %s" % (APP_NAME, msg))
class App():
def __init__(self):
self.hide_me = False
self.focus_check = False
self.mode = None
self.create_window()
self.create_menu()
self.create_statusicon()
self.toggle_hide()
def create_statusicon(self):
logINFO('** create_statusicon ..')
self.statusIcon = gtk.status_icon_new_from_file('monicon2.png')
self.statusIcon.set_visible(True)
self.statusIcon.set_tooltip(APP_NAME)
self.statusIcon.connect('popup-menu', self.status_icon_popup)
self.statusIcon.connect('activate', self.toggle_hide)
def create_window(self):
logINFO('** create_window ..')
self.window = gtk.Window()
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_UTILITY)
#~ self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_NORMAL)
self.window.set_title(APP_NAME)
self.window.set_name("%sWindow" % APP_NAME)
self.window.stick()
self.window.set_decorated(False)
self.window.set_keep_below(False)
self.window.set_keep_above(True)
self.window.set_skip_taskbar_hint(True)
self.window.add_events(gtk.gdk.FOCUS_CHANGE_MASK)
## Only if you want to hide when lost focus
#~ self.window.connect("focus-out-event", self.lost_focus)
self.window.connect("key-press-event", self.onkeypress)
self.window.connect("destroy", self.doquit)
mainbox = gtk.VBox(False, 4)
bt_box = gtk.HBox(False, 4)
## Text
self.server_dir = gtk.Entry()
## Check Box
self.checkbox = gtk.CheckButton('Check your button !')
## SpinButton
adjustment = gtk.Adjustment(value=0, lower=0, upper=512, step_incr=1, page_incr=10, page_size=0)
self.spin_bt = gtk.SpinButton(adjustment=adjustment, climb_rate=0.0, digits=0)
## Button
bt_select_dir = gtk.Button(stock=gtk.STOCK_OPEN)
bt_select_dir.connect("clicked", self.dir_chooser)
bt_1 = gtk.Button(stock=gtk.STOCK_REFRESH)
bt_2 = gtk.Button(stock=gtk.STOCK_SAVE)
bt_quit = gtk.Button(stock=gtk.STOCK_QUIT)
bt_quit.connect("clicked", self.doquit)
bt_box.pack_start(bt_select_dir)
bt_box.pack_start(bt_1)
bt_box.pack_start(bt_2)
bt_box.pack_start(bt_quit)
mainbox.pack_start(self.server_dir)
mainbox.pack_start(self.checkbox)
mainbox.pack_start(self.spin_bt)
mainbox.pack_start(bt_box)
mainbox.show_all()
self.window.add(mainbox)
def create_menu(self):
logINFO('** create_menu ..')
self.popupMenu = gtk.Menu()
#~ menuPopup = gtk.ImageMenuItem(gtk.STOCK_PREFERENCES)
#~ menuPopup.connect("activate", self.edit_config)
#~ self.popupMenu.add(menuPopup)
menuPopup = gtk.ImageMenuItem (gtk.STOCK_ABOUT)
menuPopup.connect("activate", self.show_about_dialog)
self.popupMenu.add(menuPopup)
menuPopup = gtk.ImageMenuItem(gtk.STOCK_QUIT)
menuPopup.connect("activate", self.doquit)
self.popupMenu.add(menuPopup)
self.popupMenu.show_all()
def show_window(self, mode=None):
logINFO('** show_window ..')
screen_width, screen_height = gtk.gdk.screen_width(), gtk.gdk.screen_height()
w_width , w_height = self.window.get_size()
(screen, rect, orientation) = self.statusIcon.get_geometry()
if rect[0] + w_width > screen_width:
x = screen_width - w_width
else:
x = rect[0] + w_width
y = rect[1]+rect[3]
self.window.move(x, y)
def doquit(self, widget=None, data=None):
logINFO('** doquit ..')
gtk.main_quit()
def run(self):
logINFO('** run ..')
gtk.main()
def dir_chooser(self, widget):
logINFO('** dir_chooser ..')
dialogue = gtk.FileChooserDialog("Veuillez Choisir un dossier de partage",None,gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialogue.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
dialogue.set_current_folder(os.environ['HOME'])
if dialogue.run() == gtk.RESPONSE_OK:
self.server_dir.set_text(dialogue.get_current_folder())
dialogue.destroy()
def toggle_hide(self, widget=None, event=None):
logINFO('** toggle_hide ..')
if self.hide_me:
self.hide_me = False
self.show_window()
self.window.show()
self.focus_check = True
else:
self.hide_me = True
self.focus_check = False
self.window.hide()
def lost_focus(self, widget, event):
if self.focus_check:
self.toggle_hide()
def onkeypress(self, widget, event):
if event.keyval == gtk.keysyms.Escape:
self.toggle_hide()
def status_icon_popup(self, widget, button, active_time):
logINFO('** status_icon_popup ..')
self.popupMenu.popup(None, None, None, 1, 0)
def show_about_dialog(self, widget, data=None):
about = gtk.AboutDialog()
about.set_icon_from_file('monicon2.png')
about.set_program_name(APP_NAME)
about.set_version(APP_VERSION)
#~ about.set_authors(['', ''])
#~ about.set_logo()
about.set_website('htt://www.mon_site.com')
about.set_comments(APP_DESC)
about.run()
about.destroy()
if __name__ == "__main__":
## need to change directory
SRC_PATH = os.path.dirname(os.path.realpath( __file__ ))
os.chdir(SRC_PATH)
app = App()
app.run()
David [aka] ADcomp
Hors ligne
#7 Le 04/01/2010, à 17:43
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
@ ADcomp .. Pour sur ça m'aide ..... clair ... explicite ... !!
j'ai encore pas mal de truc a apprendre ... pour sur je vai m'en inspirer et pomper des truc de-dans ^^
Rien que le truc pour DEBUG .. moi c'est a coup de [print "tadan "]et [print "pouett"] .. ..
sinon au sujet de pyftpdlib .. ça m'a l'air vraiment bien .... et beaucoup mieux ..
suffit d'installer
sudo aptitude install python-setuptools
ensuite installer la librairie
sudo easy_install.py pyftpdlib
et pour le lancer .. idem :
sudo python -m pyftpdlib.ftpserver
et voila les caracteristiques ( cité sur le site )
Features
* Support for recent FTP commands like MLSD and MLST (RFC-3659).
* Support for FTPS (FTP over TLS/SSL, still experimental and provided as a demo script). New in 0.5.1
* Support for FXP, site-to-site transfers.
* Support for IPv6 (RFC-2428).
* NAT/Firewall support with PASV/EPSV passive mode connections.
* Bandwidth throttling. New in 0.5.2
* Support for resumed transfers.
* Per-user permissions configurability.
* Maximum connections limit.
* Per-source-IP limits.
* Configurable idle timeouts for both control and data channels.
* Compact: the entire library is distributed in a single file (ftpserver.py).
* High portability:
o Entirely written in pure Python, no third party modules are used. It works on any system where select( ) or poll( ) is available.
o Extremely flexible system of "authorizers" able to manage both "virtual" and "real" users on different platforms (Windows, UNIX, OS X).
o Works with Python 2.3, 2.4, 2.5 and 2.6.
Dernière modification par UUBBUU_USER (Le 04/01/2010, à 21:23)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#8 Le 21/01/2010, à 15:05
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
j'up le post juste histoire de montrer que je suis toujours dessus ... j'ai fait quelques test de transfert simultané .
la première version sortira jpense avec le module SimpleHTTPServer .. Quoiqu' il faudrait que je me lance dans le test avec pyftpdlib.
Sinon Adcomp m'a vraiment Macher le boulot .. Vraiment Cool de sa part ^^
ps ... j'ai un script bash méteo en route depuis pas mal de temps ... je l'es repris l'autre jour ayant eu une idée géniale ... (:cool: )
a plus tard )
PEACE LOVE UNITY FREE TIBET
Hors ligne
#9 Le 21/02/2010, à 01:09
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
je reviens a votre sciences ...
j'aimerais comprendre mon erreur , voila j'essaye de mettre un système d'argument pour le script .... mais je bloque ... car quoique j'écrive .. ça ne prend pas en compte les arguments ..
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# $Id$
"""FTP server base on pyftpdlib (Site Web :http://code.google.com/p/pyftpdlib)
Usage:
nomduscript.py [options]
Defaults value :
Server port (21)
Server UP/DOWN bandwitch limit (30720) [30 Kb/sec (30 * 1024) )]
Options:
-h, --help Print this help
-p, --port <xxxx> Port Number
-u, --upload <xxxx> Upload Limit
-d, --download <xxxx> Download Limit"""
import os
import getopt, sys
from pyftpdlib import ftpserver
def helpINFO():
print __doc__
class main__ ():
# simulate command line invocation
sys.argv = ["pyftpdlib_ftp.py", "-drp", "/home", "21"]
DEFAULT_PORT = 21
UP_LIMIT = 30720
DOWN_LIMIT = 30720
USER = 'user'
PASSWORD = 'password'
SHARE_DIR = os.getcwd()
try:
options, arguments = getopt.getopt(sys.argv[1], "hdr:p:", ["help", "default", "repertoire=", "port=", "speed-upload=", "speed-download="])
for opt, arg in options:
if opt in ("-h", "--help"):
print("printing help")
helpINFO()
elif opt in ("-d", "--default"):
print("Normal Value")
elif opt in ("--repertoire"):
print("repertoire = ")
SHARE_DIR = arg
elif opt in ("-p", "--port"):
print("port n° = ")
DEFAULT_PORT = arg
elif opt in ("-u", "--upload"):
print("upload limit = ")
UP_LIMIT = arg
elif opt in ("-d", "--download"):
print("download limit = ")
DOWN_LIMIT = arg
except:
helpINFO()
sys.exit(2)
print DEFAULT_PORT
print UP_LIMIT
print DOWN_LIMIT
print USER
print PASSWORD
print SHARE_DIR
if __name__ == "__main__":
main__()
merci d'avance pour les corrections ... oubien .. les remarques ))
Dernière modification par UUBBUU_USER (Le 21/02/2010, à 01:10)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#10 Le 21/02/2010, à 17:52
- magestik
Re : Aide a la réalisation d'un script Python
options, arguments = getopt.getopt(sys.argv[1], "hdr:p:", ["help", "default", "repertoire=", "port=", "speed-upload=", "speed-download="])
le problème ça doit être : "sys.argv[1]". T'as essayé de mettre juste sys.argv ou juste argv ?
Hors ligne
#11 Le 21/02/2010, à 18:50
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Salut Magestik .. vi aprés retest .. ça ne change rien .....
si jamais je change en sys.argv ou ça ne fonctionne pas .. ( ça renvoie les valeurs par défauts ) .. et lorsque je mets argv ça m'affiche l'aide ..
Après peut-être que la ligne pour test n'est pas bonne ..
sys.argv = ["pyftpdlib_ftp.py", "-drp", "/home", "21"]
j'ai tester également en mettant
sys.argv = ["pyftpdlib_ftp.py", "-r", "/home", "-p", "21"]
Sans réel succés ..
Dur dur les arguments en python
PEACE LOVE UNITY FREE TIBET
Hors ligne
#12 Le 21/02/2010, à 19:05
- magestik
Re : Aide a la réalisation d'un script Python
Au début c'est assez chiant. Mais tu as essayé de le faire comme en vrai ?
En gros pas simuler des arguments mais les passer en vrai ?
Hors ligne
#13 Le 21/02/2010, à 20:18
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
j'ai essayer en vrai au départ . Mais alors que mes résultats était infructueux .et ne sachant pas vraiment comment faire ... j'ai trouver cette astuce en piannotant sur le web ...
a la recherche d'info sur getopt ...
A mon avis ... je fait erreur car j'essaye d'intégrer trop de paramètre d'un seul coup ..
Ptêt que ma déclaration :
options, arguments = getopt.getopt(sys.argv[1], "hdr:p:", ["help", "default", "repertoire=", "port=", "speed-upload=", "speed-download="])
n'est pas bonne ..
PEACE LOVE UNITY FREE TIBET
Hors ligne
#14 Le 21/02/2010, à 21:39
- magestik
Re : Aide a la réalisation d'un script Python
options, arguments = getopt.getopt(sys.argv[1], "hdr:p:", ["help", "default", "repertoire=", "port=", "speed-upload=", "speed-download="])
Pour moi c'est sur que "sys.argv[1]" est faux. Peut-être que je me trompe maisla tu prends que le [1] ... Vire le "[1]" pour commencer.
J'utilise getopt dans mon prog python et voilà ce que j'ai fait :
if len(sys.argv)>1: # Il y a (au moins) un argument
try:
opts, args = getopt.getopt(argv, "hf:", ["help", "file="])
for opt, arg in opts: # Traitement des parametres
if opt in ("-h", "--help"):
usage()
sys.exit()
elif opt in ("-f", "--file"):
fopen = arg
except getopt.GetoptError:
print "No arg"
if sys.argv[1][0] == "/": # Cas du lancement auto
fopen = sys.argv[1]
else:
usage()
sys.exit(2)
Sinon j'avais aussi remarqué un problème dans ton truc. Il y a plus de nom long que de nom court. Regarde :
h -> help
d -> default
r: -> repertoire=
p: -> port=
Et après ?
? -> speed-upload=
? -> speed-download=
J'espèere que mon message t'aidera.
Hors ligne
#15 Le 21/02/2010, à 22:18
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Ah ... j'pensais que l'on pouvais avoir des noms longs sans version courtes .....
Sinon .. dans ton exemple tu a qu'un seul paramètre .... Moi il faut que j'en passe 7 au minimun ..( spécifier ou pas le port du serveur .. le répèrtoire a partager .... et encore pour l'instant j'ai pas tout mis ...
D'ou peut-être la complication et les erreurs ....
jvai tester en mettant autant de noms longs et cours ..
edit : .. tin ya plein d'erreur sur mon script ) ..
voila MAJ :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# $Id$
"""FTP server base on pyftpdlib (Site Web :http://code.google.com/p/pyftpdlib)
Usage:
nomduscript.py [options]
Defaults value :
Server port (21)
Server UP/DOWN bandwitch limit (30720) [30 Kb/sec (30 * 1024) )]
Server share : current script directory
Options:
-h, --help Print this help
-p, --port <xxxx> Port Number
-u, --upload <xxxx> Upload Limit
-d, --download <xxxx> Download Limit"""
import os
import getopt, sys
from pyftpdlib import ftpserver
def helpINFO():
print __doc__
class main__ ():
# simulate command line invocation
sys.argv = ["pyftpdlib_ftp.py", "-r", "/home", "-p", "21"]
DEFAULT_PORT = 21
UP_LIMIT = 30720
DOWN_LIMIT = 30720
USER = 'user'
PASSWORD = 'password'
SHARE_DIR = os.getcwd()
try:
options, arguments = getopt.getopt(sys.argv, "hr:p:u:d:", ["help", "repertoire=", "port=", "upload=", "download="])
for opt, arg in options:
if opt in ("-h", "--help"):
print("printing help")
helpINFO()
elif opt in ("-r", "--repertoire"):
print("repertoire = ")
SHARE_DIR = arg
elif opt in ("-p", "--port"):
print("port n° = ")
DEFAULT_PORT = arg
elif opt in ("-u", "--upload"):
print("upload limit = ")
UP_LIMIT = arg
elif opt in ("-d", "--download"):
print("download limit = ")
DOWN_LIMIT = arg
except:
helpINFO()
sys.exit(2)
print DEFAULT_PORT
print UP_LIMIT
print DOWN_LIMIT
print USER
print PASSWORD
print SHARE_DIR
if __name__ == "__main__":
main__()
Dernière modification par UUBBUU_USER (Le 21/02/2010, à 22:23)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#16 Le 22/02/2010, à 13:57
- magestik
Re : Aide a la réalisation d'un script Python
Ah désolé je me suis planté.
Essaye avec ça :
sys.argv[1:]
En fait moi j'ai argv parce que je suis à l'interieur d'une fonction que j'ai fait ... et argv est un paramètre qui a pour valeur sys.argv[1:]. Voilà, ça va marcher (Enfin ça devrait)
Encore désolé.
Magestik
Hors ligne
#17 Le 22/02/2010, à 19:09
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Oué .. super magestik ..... ça fonctionne ..... par contre .. j'aimerais comprendre .. dans le cas d'un argument de script .. il faut utiliser "sys.argv[1:]" sinon pour une fonction ( au sein d'un script ), afin de récupérer un argument on mets seulement "sys.argv" ????
Quel est le role de "[1:]" ??
Mon erreur au début était quand même une grosse boulette .... mettres toutes les options accoller
sys.argv = ["pyftpdlib_ftp.py", "-drp", "/home", "21"]
alors que
sys.argv = ["pyftpdlib_ftp.py", "-r", "/home", "-p", "21"]
est quand même mieux..
A moins qu'il soit possible de décomposer les options ... et en déduire les arguments ..
mon_script.py -xyz arg_x arg_y arg_z
options : => " -xyz"
arguments : => "arg_x" "arg_y" "arg_z"
Dernière modification par UUBBUU_USER (Le 22/02/2010, à 19:17)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#18 Le 22/02/2010, à 19:14
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Pour ceux qui suivent le topic ... pyftplib est vraiment une chouette librairie ...nécessitant une installation .. . il est vrai ... mais dés lors que je souhaitais contrôler la bande passante ( et vu mon maigre niveau ) il aurait fallut passer par un paquet tiers ( trickle ) ou bien créer un fichier de "QOS" spécifique ... qui compliquait énormément la tache ... pyftplib ... étant une librairie dédier ... autant l'utiliser ^^ ..
PEACE LOVE UNITY FREE TIBET
Hors ligne
#19 Le 22/02/2010, à 19:26
- Kanor
Re : Aide a la réalisation d'un script Python
Quel est le role de "[1:]" ??
Tu comprend pas ça oh tu dois avoir du mal avec python
tu peux trouver plus d'info avec le terme slice
mais pour résumer si on a la liste suivante
a = [1,2,3,4,4,3]
le slice marche en comptant à partir de zéro les intevalle dans l'exemple du dessus ça donne
1 est entre 0 et 1
2 est entre 1 et 2
3 est entre 2 et 3 ...
donc si tu veux avoir les 3 premier element tu fais
a[0:3]
dans ton cas le a[1:] permet d'avoir tous les element à partir de l'interval 1 donc ça donne
[2,3,4,4,3]
Tu peux aussi utiliser des chiffre négative par exemple a[1:-1] donne
[2,3,4,4]
il faut seulement compter à partir de la fin
Sinon pour la gestion des argument il faut mieux utiliser cette librairie
http://docs.python.org/library/optparse.html
Hors ligne
#20 Le 22/02/2010, à 19:35
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
... Bien ... clair ..
En effet .. non pas que j'ai du mal .... mais je débute .... (vraiment débute) .. La seule chose que je savais la dessus c'était que l'argument 1 c'est le nom du script ... ( en shell bash c'est $0 ) ..
Dernière modification par UUBBUU_USER (Le 22/02/2010, à 19:43)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#21 Le 22/02/2010, à 20:31
- magestik
Re : Aide a la réalisation d'un script Python
a = [1,2,3,4,4,3]
a[0] = 1
a[1] = 2
a[2] = 3
...
Et tu peux en prendre plusieurs d'un coups. Donc si tu mets a[1:3] ca prendra la liste de [1] à [3]. Et si tu specifie pas l'argument ca veut dire jusqu'à la fin, comme ça [5:] (ou depuis le début [:3]). Pour l'histoire de sys.argv que je citais plus haut t'emmêle pas avec tu peux pas comprendre sans mon code Je m'étais emmêle les pinceaux
Dernière modification par magestik (Le 22/02/2010, à 20:32)
Hors ligne
#22 Le 23/02/2010, à 18:53
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
@ kanor .. en effet .. optparse est pas mal .... et plus riche en fonctionnalités ..
class main__ ():
# simulate command line invocation
sys.argv = ["pyftpdlib_ftp.py","-h"]
Get_ARGV__ = optparse.OptionParser()
Get_ARGV__GROUP_SERVER = optparse.OptionGroup(Get_ARGV__, "*General ", "General FTP Options.")
Get_ARGV__GROUP_SERVER.add_option("-s", dest="SHARE_DIR", help="Share directory")
Get_ARGV__GROUP_SERVER.add_option("-p", dest="PORT_NUMBER", help="Server Port Number")
Get_ARGV__.add_option_group(Get_ARGV__GROUP_SERVER)
Get_ARGV__GROUP_SPEED = optparse.OptionGroup(Get_ARGV__, "*BandWitch Limiter ","""Defaults upload and download limit (30720)
Exemple : 30720 = 30 Kb/sec (30 x 1024)""")
Get_ARGV__GROUP_SPEED.add_option("-u", dest="UPLOAD_LIMIT", help="UpStream Limit")
Get_ARGV__GROUP_SPEED.add_option("-d", dest="DOWN_LIMIT", help="DownStream Limit")
Get_ARGV__.add_option_group(Get_ARGV__GROUP_SPEED)
options, remainder = Get_ARGV__.parse_args()
Par contre, au niveau de mon projet .... je vais devoir l'utiliser au sein d'une classe .. et donc appeler et passer les arguments via l'interfaces GUI ( si je coche repertoire .. je choisi le repertoire et lors du lancement du serveur .. je récup les paramètres ... ( j'espère être assez clair .. ) Lors de tes interventions Majestik .... j'ai crus comprendre que les paramètres intra-classes ( !! ) ne serait pas pareil ???????
Dernière modification par UUBBUU_USER (Le 23/02/2010, à 19:04)
PEACE LOVE UNITY FREE TIBET
Hors ligne
#23 Le 23/02/2010, à 19:01
- magestik
Re : Aide a la réalisation d'un script Python
C'est moi qui ai du mal expliquer alors.
Hors ligne
#24 Le 23/02/2010, à 19:05
- UUBBUU_USER
Re : Aide a la réalisation d'un script Python
Donc le passage de paramètres est le même ?????
PEACE LOVE UNITY FREE TIBET
Hors ligne
#25 Le 23/02/2010, à 20:28
- magestik
Re : Aide a la réalisation d'un script Python
Oui
Hors ligne