Exécution de python sous PHP

a marqué ce sujet comme résolu.

C’est noté Moté, merci!

On ne peut pas exécuter de script python à partir de PHP sans que l’hébergeur n’intervienne? Ce site là est un projet afin de valider mon diplôme donc payer ce prix la n’est vraiment pas intéressant

Non, si ton hébergement ne t’autorise pas à exécuter de python, alors tu ne peux tout simplement pas. Dans tous les cas, php est obligé de passer à un moment un appel à l’exécutable python chargé d’interpréter le code python. Si on ne t’autorise pas à lancer l’exécutable, alors c’est mort.

Il y a peut-être d’autres offres d’hébergement qui te permettraient de le faire.

+0 -0

Il existe bien une solution : ce serait de télécharger l’archive d’installation de Python et de lancer le setup en utilisant la commande PHP shell_exec. Après il peut exister quelques contraintes avec l’environnement à résoudre au cas par cas ; c’est difficile pour moi de te donner les directives claires. Le plus facile ça reste de choisir une offre adaptée en Python 3.

+0 -0

Merci a vous 2. Comme j’ai écrit tout à l’heure, c’est un site juste pour le plaisir et pour valider mon diplome.
Ce que j’aimerai c’est que mon csv soit à jour toutes les heures.
Dans le meilleur des cas, j’aimerai que mon script python se lance toutes les heures, chose qui n’est pas possible en ligne avec OVH, mais est-il possible de le faire hors ligne? Et de créer une action afin qu’avec Filezilla ou autre client ftp, il envoie toutes les heures le fichier csv en écrasant celui deja en ligne.
Sinon je peux tester ta solution Yarflam

Il existe bien une solution : ce serait de télécharger l’archive d’installation de Python et de lancer le setup en utilisant la commande PHP shell_exec. Après il peut exister quelques contraintes avec l’environnement à résoudre au cas par cas

Merci à tous les 2

Dans le meilleur des cas, j’aimerai que mon script python se lance toutes les heures, chose qui n’est pas possible en ligne avec OVH, mais est-il possible de le faire hors ligne? Et de créer une action afin qu’avec Filezilla ou autre client ftp, il envoie toutes les heures le fichier csv en écrasant celui deja en ligne.

fut4fun

Oui, tu peux tout à fait utiliser une bibliothèque Python pour envoyer ton CSV généré via FTP. Ce sera beaucoup plus simple !

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
file.close()                                    # close file and FTP
session.quit()

Source StackOverflow

Merci Yarflam !!

J’essaye cela tout de suite !!

Etant donné que j’ai plusieurs csv (pour l’instant 4, mais d’ici quelques mois plus d’une dizaine), dois je faire un script pour chaque csv à envoyer ou puis je mettre dans le même script tous les csv a envoyer?

je vais essayer pour un déjà :D

Tu peux créer le fichier SetInterval.py dans le même répertoire :

#!/bin/python
from threading import Timer
import sys

class SetInterval():
    def __init__(self, fct, sec):
        self.fct = fct;
        self.sec = sec;
        self.timer = Timer(self.sec, self.handle)
        self.timer.start()
        self.start()
    def handle(self):
        if self.run:
            self.timer = Timer(self.sec, self.handle)
            self.timer.start()
            self.fct()
    def start(self):
        self.run = True
    def stop(self):
        self.run = False

sys.modules[__name__] = SetInterval

Et l’utiliser dans ton script comme dans cet exemple :

#!/bin/python
import SetInterval

i = 0
def worker(): # La fonction redondante
    global i
    i += 1
    print(i)

SetInterval(worker, 1) # Toutes les secondes

En laissant le script de côté, ça te permet d’exécuter tes instructions de façon périodique.

Après tu peux le rendre invisible et le programmer au démarrage du PC, voir mon snippet.

Salut à toi Yarflam !

J’ai pas tout suivi concernant la fonction redondante. Dans mon cas, j’ai mes 4 scripts à exécuter afin de remplir le csv et les 4 autres scripts afin de les envoyer en ftp. Concernant les envois en ftp, puis je faire :

import ftplib
session = ftplib.FTP('server.address.com','USERNAME','PASSWORD')
file = open('kitten.jpg','rb')                  # file to send
file1 = open('kitten1.jpg','rb')                  # file to send
file2 = open('kitten2.jpg','rb')                  # file to send
file3 = open('kitten3.jpg','rb')                  # file to send
session.storbinary('STOR kitten.jpg', file)     # send the file
session.storbinary('STOR kitten1.jpg', file)     # send the file
session.storbinary('STOR kitten2.jpg', file)     # send the file
session.storbinary('STOR kitten3.jpg', file)     # send the file
file.close()                                    # close file and FTP
file1.close()                                    # close file and FTP
file2.close()                                    # close file and FTP
file3.close()                                    # close file and FTP
session.quit()

Ou est il préférable de créer plusieurs scripts ?

Pour finir, j’ai vu ton code sur Github, cela m’interesse fortement, le problème est que je ne sais pas dans quel script je dois mettre ces fonctions… :D
Comme je t’ai dit, c’est mon 1er site avec du Python o_O

Merci encore pour toute l’aide

Je l’ai fait comme ça :

#!/bin/python


import ftplib
import SetInterval

i = 0
def worker(): # La fonction redondante
    global i
    i += 1
    print(i)
    session = ftplib.FTP('ftp.cluster021.hosting.ovh.net','USER','MDP')
    file = open('fut21futMilli100k.csv','rb')                  # file to send
    session.storbinary('STOR www/fut21futMilli100k.csv', file)     # send the file
    file.close()                                    # close file and FTP
    file = open('fut21futMilli500k.csv','rb')                  # file to send
    session.storbinary('STOR www/fut21futMilli500k.csv', file)     # send the file
    file.close()                                    # close file and FTP
    file = open('fut21futMilli1M.csv','rb')                  # file to send
    session.storbinary('STOR www/fut21futMilli1M.csv', file)     # send the 
    file.close()                                    # close file and FTP
    file = open('fut21techSpeciaux.csv','rb')                  # file to send
    session.storbinary('STOR www/fut21futtechSpeciaux.csv', file)     # send the file
    file.close()                                    # close file and FTP
    session.quit()
SetInterval(worker, 3600) # Toutes les heures


Cela fonctionne nickel
Je vais faire de même pour tous mes scripts utilisant le csv
Concernant ton code Github, je n’ai pas tout compris… Il sert à lancer le script automatiquement dès que tu allume le PC ?

Finalement j’ai tout regroupé dans chaque script :

#!/bin/python

import requests
from bs4 import BeautifulSoup
import re
import csv
import SetInterval
import ftplib

players=[]
k = 0
def worker(): # La fonction redondante
    global k
    k += 1
    print(k)

    for i in range(1,7):
        url = 'url de la page'
        response = requests.get(url)
        if response.ok:
            soup = BeautifulSoup(response.text,'lxml')
            tbody = soup.find('tbody')
            extracted = tbody.findAll('tr', {'class': re.compile('player_tr_\d+')})
            #print(extracted)
            for td in extracted :
                name = td.find('a', class_='player_name_players_table')
                #print(name.text)
                detail = td.find('span', class_= 'players_club_nation')
                if detail:
                    club = detail.find('a')
                clubLink = club['data-original-title']
                #print(clubLink)
                pays = club.find_next('a')
                paysLink = pays['data-original-title']
                #print(paysLink)
                league = pays.find_next('a')
                leagueLink = league['data-original-title']
                #print(leagueLink)
                #imgPlayer = td.find('img', class_='player_img')
                #if imgPlayer:
                #    imgPlayerLink = imgPlayer['data-original']
                #print(imgPlayerLink)
                note = name.find_next('td')
                #print(note.text)
                position = note.find_next('td')
                #print(position.text)
                version = position.find_next('td')
                #print(version.text)
                prix = version.find_next('td')
                #print(prix.text)
                #print(players)
                players.append([name.text, clubLink, paysLink, leagueLink, note.text, position.text, version.text, prix.text ])
                
                f = 'fut21techSpeciaux.csv'
                file = open(f, 'w', newline="", encoding="UTF-8")    
                try:
                    #
                    # Création de l'''écrivain'' CSV.
                    #
                    writer = csv.writer(file)
                
                    #
                    # Écriture de la ligne d'en-tête avec le titre
                    # des colonnes.

                    #
                    # Écriture des quelques données.
                    for row in players:
                        
                        writer.writerow(row)
                finally:
                    #
                    # Fermeture du fichier source
                    #
                    file.close()  
    session = ftplib.FTP('ftp.cluster021.hosting.ovh.net','USER','MDP')
    file = open('fut21techSpeciaux.csv','rb')                  # file to send
    session.storbinary('STOR www/fut21techSpeciaux.csv', file)     # send the file
    file.close()                                    # close file and FTP
    session.quit()
SetInterval(worker, 7200) # Toutes les 4 heures

J’ai mis toutes les 4 heures car le site me bloque l’accès s’il y a trop de requetes o_O
Même avec un VPN :colere2:

Je pense qu’on est bon.
Je laisse tourner toute la journée et je marquerai le sujet comme résolu s’il n’y a aucun problème

Merci à vous 2 vraiment

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte