Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: api w python dla php
Forum PHP.pl > Forum > PHP
Adagio
Witam,
Dostałem zadanie na zajęciach, mianowicie napisać w pythonie interfejs dla php.
Dokładnie chodzi o to aby przekazywać z php parametry do pythona, który będzie coś z nimi robił i zwracał wyniki.

Czy ktoś mógłby mi wyjaśnić w ogóle jak pisać api i rozwiązać komunikację między różnymi językami?
Nigdy podobnego tematu nie ruszałem stąd te braki smile.gif

Z góry thx za wszelkie wskazówki!
erix
Cytat
Czy ktoś mógłby mi wyjaśnić w ogóle jak pisać api i rozwiązać komunikację między różnymi językami?

Robisz skrypt wPHP dostosowany pod php-cli, czyli nie masz np. GET/POST, tylko argc/argv i w Pythonie po prostu przechwytujesz wyjście z polecenia. winksmiley.jpg

Możesz równie dobrze z innego języka korzystać w ten sposób, żaden problem. ;]
Adagio
ech jakoś to do mnie nie przemawia wstydnis.gif
może jeszcze raz...

Mam stronę www z formularzem, na przykład: input, w którym podaję liczbę oraz przycisk submit.
Z tego co napisałeś rozumiem, że podaną na stronie www liczbę muszę przekazać do pośredniczącego skryptu w php.
Następnie ta zmienna powinna zostać przesłana do skryptu w pythonie. I tu jest problem bo tego właśnie nie wiem. Jak wywołać za pomocą języka php skrypt w pythonie i podać na jego wejście zmienną?
erix
Aha, czyli na odwrót. winksmiley.jpg

Cytat
języka php skrypt w pythonie i podać na jego wejście zmienną?

Przyznam, że nie znam (jeszcze) Pythona, więc pozostaje mi na razie spekulować, że mógłbyś np. wyeksportować te zmienne do jakiegoś pliku (np. XML/WSDL) i w skrypcie Pythona go parsować. A odpalasz go przez zwykły exec" title="Zobacz w manualu PHP" target="_manual.
impimp94
Możesz wyeksportować zmienne z php do pliku *.txt lub do bazy mysql.
A potem w pythonie pobrać te zmienne
Adagio
Cytat(impimp94 @ 23.05.2009, 07:49:20 ) *
Możesz wyeksportować zmienne z php do pliku *.txt lub do bazy mysql.
A potem w pythonie pobrać te zmienne

Można, tylko pozostaje kwestia powiadomienia skryptu w pythonie, że takie dane tam umieściłem. Całkowicie odpada tu cron, gdyż skrypt musi zostać zainicjowany z php.

@erix zaproponował użycie exec" title="Zobacz w manualu PHP" target="_manual do odpalenia skryptu python. Podałem na wejście parametry z jakimi ma program wystartować i działa smile.gif, także odpadły tutaj sprawy z przekazywaniem danych przez db, pliki itp.

Jednak zastanawia mnie czy można to zrobić jeszcze inaczej? Mimo wszystko używanie polecenia exec chyba nie jest bezpieczne...
erix
Cytat
że takie dane tam umieściłem

A nie możesz po prostu sprawdzić, czy plik istnieje? tongue.gif

Cytat
Jednak zastanawia mnie czy można to zrobić jeszcze inaczej?

No, na plikach/cronem/etc.

Cytat
Mimo wszystko używanie polecenia exec chyba nie jest bezpieczne...

Jeśli nie ubezpieczasz zmiennych przez escapeshellarg" title="Zobacz w manualu PHP" target="_manual, to nie jest. tongue.gif
ska
Cytat(Adagio @ 22.05.2009, 15:53:57 ) *
Witam,
Dostałem zadanie na zajęciach, mianowicie napisać w pythonie interfejs dla php.
Dokładnie chodzi o to aby przekazywać z php parametry do pythona, który będzie coś z nimi robił i zwracał wyniki.

Czy ktoś mógłby mi wyjaśnić w ogóle jak pisać api i rozwiązać komunikację między różnymi językami?
Nigdy podobnego tematu nie ruszałem stąd te braki smile.gif

Z góry thx za wszelkie wskazówki!

Opakuj sobie po stronie PHP w jakąś klasę kilka wywołań xmlrpc, a po stronie Pythona napisz sobie (tips&tricks: napisałem Ci już poniżej) wielowątkowy serwer i masz komunikację.

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

import SocketServer
import SimpleXMLRPCServer

IP_ADDRESS = '127.0.0.1'
PORT = '6666'

def do_request(args):
    print 'Args from PHP: %s' % args

class AsyncXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer.SimpleXMLRPCServer):
    """
    Multi-thread implemantation.
    Threaded mix-in
    """
    pass

if __name__ == '__main__':
    # Register functions and run server.
    server = AsyncXMLRPCServer((IP_ADDRESS, PORT), SimpleXMLRPCServer.SimpleXMLRPCRequestHandler, allow_none=1)
    server.register_function(do_request, 'do_request')

    print 'Listing on %s port %d' % (IP_ADDRESS, PORT)
    server.serve_forever()
erix
A po chorobę marnować zasoby na pakowanie wszystkiego w XML...?
ska
Cytat(erix @ 6.08.2009, 18:34:41 ) *
A po chorobę marnować zasoby na pakowanie wszystkiego w XML...?

Zapytaj się jego twórców? blinksmiley.gif A może XML został stworzony jako standard przechowywania i reprezentowania danych dla którego transpretne są platformy i języki? hmmm Może właśnie dlatego (oczywiście między innymi) jest wykorzystywany w rozszerzonej wersji RPC standardu RFC 1057? A może dlatego, że słowo API zazwyczaj niesie za sobą coś co się nazywa uniwersalność/standard/rozszerzalność?
Rozumiem, że skoro tak mówisz, dyponujesz benchmarkami dla opakowania dumpowanych obiektów przez XML z wykorzystaniem procedur C; a może tylko powtarzasz zasłyszane głupoty typu "xml to złoo"?

Cytat(erix @ 23.05.2009, 15:03:37 ) *
A nie możesz po prostu sprawdzić, czy plik istnieje? tongue.gif
No, na plikach/cronem/etc.

Bez jaj ma napisać API, nie księgę gości.
erix
Cytat
Rozumiem, że skoro tak mówisz, dyponujesz benchmarkami dla opakowania dumpowanych obiektów przez XML z wykorzystaniem procedur C; a może tylko powtarzasz zasłyszane głupoty typu "xml to złoo"?

Nie mówię, że zło, tylko w tym konkretnym przypadku jest to niepotrzebny narzut - rozumiem - międzyplatformowo, ale na tym samym hoście, w jego konkretnym skrypcie lepiej po prostu strzelać czystym tekstem z jakimś separatorem albo w ostateczności przez JSON (napisanie jakiegoś prostego protokołu byłoby banalne).

XML nie jest zły, ale w tym konkretnym zastosowaniu IMHO mocno przesadzony.
ska
Cytat(erix @ 7.08.2009, 12:32:33 ) *
Nie mówię, że zło, tylko w tym konkretnym przypadku jest to niepotrzebny narzut - rozumiem - międzyplatformowo, ale na tym samym hoście, w jego konkretnym skrypcie lepiej po prostu strzelać czystym tekstem z jakimś separatorem albo w ostateczności przez JSON (napisanie jakiegoś prostego protokołu byłoby banalne).

XML nie jest zły, ale w tym konkretnym zastosowaniu IMHO mocno przesadzony.

A od kiedy pod poleceniem "zaprojektować API" kryje się skrypcik na jednym hoście ? Tutaj nie rozumiesz, zadaniem jest opracowanie API działającego w wiekszości popularnych środowisk i sytuacji, a nie dla jednego przykładu odpalanego na localhost.
carbolymer
Może zamiast XMLRPC, użyć RPC ?
Spróbuj Pipe'ami (proc_open), imo najlepsze rozwiązanie (tylko dopilnuj blokowania rurek ;] ). Możesz też użyć pamięci współdzielonej (prostsze od pipe'ów), semafor, plików w których będą zakolejkowane komendy, socketów do komunikacji między procesami, lub też ostatecznie przez parametry wywołania, ale ta ostatnia opcja jest nieplastyczna, bo przekazać instrukcje możesz tylko raz.

Jest w czym wybierać. Wszystko ładnie opisane na google.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.