2016-12-29 3 views
1

У меня есть файл python, который состоит из одной функции, machineLearning(issue).PHP - как вызвать определенную функцию из программы python (Python 3.4, PHP 7, CodeIgniter)

В моем PHP кода, чтобы запустить сценарий Python, я следующее:

'category' => exec("python C:/xampp/htdocs/ci/assets/machineLearning.py $temp 2>&1"), 

, которая запускает функцию машинное обучение, как и ожидалось. Однако мне нужно включить еще одну функцию: updateTrain, которая принимает параметры issue, category. Вот текущий файл питон:

from textblob import TextBlob; 
from textblob.classifiers import NaiveBayesClassifier; 
import sys; 

train = [ 
    ('I cannot enter or exit the building','idCard'), 
    ('Enter or exit', 'idCard'), 
    ('Card needs replacing','idCard'), 
    ('ID card not working','idCard'), 
    ('Printing', 'printer'), 
    ("My ID Card doesn't sign me into the printers", "printer"), 
    ('Mono', "printer"), 
    ('Colour Printing',"printer"), 
    ('I cannot connect my phone to the wifi', 'byod'), 
    ('I do not get emails on my phone, tablet, or laptop', 'byod'), 
    ('Cannot send emails','email'), 
    ('Do not recieve emails','email'), 
    ('Cannot sign in to moodle', 'email'), 
    ('Cannot sign in to computer','desktop_pc'), 
    ("Software isn't working",'desktop_pc'), 
    ('Scratch disks are full', 'desktop_pc'), 
    ('I have forgotten my password for the computers', 'desktop_pc'), 
    ('forgotten password','forgotten_password'), 
    ('My password does not work','forgotten_password'), 
    ('Applications fail to launch and I get an error', 'desktop_pc'), 
    ('My ID card does not allow me to print. I go to scan my card on the printer, and it comes up with a message saying that I need to associate my card every day I want to print. Other peoples cards work fine?','idCard'), 
    ("I am having trouble connecting my android phone to my emails. I open the gmail app and select exchange account. I then enter my email and password and click okay on the message that asks if its alright to use the autoconfigure.xml. It then gives me all the server details, I click okay and then it tells me that I cannot connect to the server.", 'byod'), 
    ('I cannot find my work', 'lost_work'), 
    ('My work has been corrupted', 'lost_work'), 
    ('My work has been lost', 'lost_work'), 
    ('Coursework gone missing', 'lost_work'), 
    ('my id card isnt working','idCard'), 
    ('I cannot print in colour', 'printer') 
] 

cl = NaiveBayesClassifier(train); 

def updateTrain(issue, category): 
    new_data = [(issue,category)]; 
    cl.update(new_data); 


def machineLearning(issue): 
    test = [ 
     ("My id card does not allow me to go through the gates, the light flashes orange and then goes red. The gate doesn't open", "idCard"), 
     ('My id card has snapped', 'idCard'), 
     ('When printing, swiping my ID card does not automatically sign me in, I have to manually register my card', 'printer'), 
     ('I am getting errors when trying to sign into my email account on the website', 'email'), 
     ('Microsoft applications were not working','desktop_pc'), 
     ('Software is missing','desktop_pc'), 
     ('software keeps crashing','desktop_pc'), 
     ('my phone refuses to connect to the internet','byod'), 
     ('I cannot sign in to the computers, moodle or emails because I have forgotten my password','desktop_pc'), 
     ('I cannot get my emails on my device I bought from home','byod'), 
     ('My ID card does not allow me to print. I go to scan my card on the printer, and it comes up with a message saying that I need to associate my card every day I want to print. Other peoples cards work fine?','idCard'), 
     ('My password does not allow me to sign in to the computers, laptops, moodle or emails','forgotten_password'), 
     ('I have forgotten my password','forgotten_poassword'), 
     ('My work has been corrupted', 'lost_work'), 
     ('My work has been lost', 'lost_work'), 
     ('Coursework gone missing', 'lost_work'), 
     ('I cannot print in colour', 'printer'), 
    ]; 
    print(cl.classify(issue)); 

if __name__ == "__main__": 
    machineLearning(sys.argv[1]); 

Как updateTrain(issue, category) принимает 2 аргумента, как я могу изменить выше exec команду так, что она игнорирует поезд обновления?

Аналогично, как я могу позвонить updateTrain, игнорируя функцию machineLearning?

ответ

1

Учитывая, что вы вызываете свой скрипт Python из PHP-кода, я считаю, что лучшим решением (или, по крайней мере, самым простым из текущей ситуации) было бы передать аргументы этому скрипту.

В теле вашего скрипта (if __name__ == "__main__") вы хотите проверить, какие параметры переданы скрипту. Например, если вы хотите, чтобы вызвать метод updateTrain, игнорируя machineLearning метод:

if sys.argv[1] == "updateTrain": 
    updateTrain() 
elif sys.argv[1] == "machineLearning": 
    machineLearning() 

Затем, когда вы вызываете этот сценарий из PHP, вам нужно будет пройти либо updateTrain или machineLearning в качестве параметра, который легко так как вы работаете с командой Bash:

'category' => exec("python C:/xampp/htdocs/ci/assets/machineLearning.py updateTrain 2>&1") 

в более сложной ситуации, когда вам нужно передать аргументы функции вы называете, вы должны передать их в команду, а также. Например, поскольку updateTrain принимает два аргумента, скажем, два целых числа:

if sys.argv[1] == "updateTrain": 
    issue = int(sys.argv[2]) 
    category = int(sys.argv[3]) 
    updateTrain(issue, category) 

И ваш PHP вызов станут:

'category' => exec("python C:/xampp/htdocs/ci/assets/machineLearning.py updateTrain 12 42 2>&1") 

В конце концов, ваш скрипт будет выглядеть примерно так:

if __name__ == "__main__": 
    if sys.argv[1] == "updateTrain": 
     if len(sys.argv) >= 4: 
      issue = sys.argv[2]  # convert it to the right type 
      category = sys.argv[3] # convert it too 
      updateTrain(issue, category) 

    elif sys.argv[1] == "machineLearning": 
     if len(sys.argv) >= 3: 
      issue = sys.argv[2] # convert it here as well 
      machineLearning(issue) 

    else: 
     print("Unknown command") 

После этого сценарий обычно вызывается следующими командами, которые должны быть pas СЭД на exec в PHP:

python machineLearning.py updateTrain 12 42 
python machineLearning.py machineLearning 25 

Как примечание стороны, помните, что это быстрое решение, в то время как дает реальное и полное Bash команду поведение как к сценарию будет гораздо сложнее. Кроме того, существует несколько библиотек, таких как argparse, которые упрощают запись полных команд.

+0

Не могли бы вы объяснить, почему требуется найти длину sys.argv? –

+0

@ RobbieWhite Это очень, очень, очень простая проверка ввода. Вы хотите получить доступ к 'sys.argv [2]', поэтому вы хотите знать, можете ли вы это сделать.Хотя «попытка, а затем оправдание» считается более pythonic, чем «сначала запрашивать разрешение», я думаю, что в этом конкретном случае лучше проверить длину 'sys.argv' до доступа к ее элементам, а не пытаться получить доступ его элементы, а затем обрабатывать исключение «IndexError». –

+0

@RobbieWhite Но так или иначе, это не нужно, особенно если вы единственный вызывающий абонент. Я просто хотел бы дать мне несколько охранников. –

 Смежные вопросы

  • Нет связанных вопросов^_^