Eu gostaria de chamar uma função Python do código JavaScript, porque não há uma alternativa em JavaScript para fazer o que eu quero. Isso é possível? Você poderia ajustar o snippet abaixo para funcionar?
Código JavaScript:
var tag = document.getElementsByTagName("p")[0];
text = tag.innerHTML;
// Here I would like to call the Python interpreter with Python function
arrOfStrings = openSomehowPythonInterpreter("~/pythoncode.py", "processParagraph(text)");
~/pythoncode.py
contém funções que usam bibliotecas avançadas que não têm um equivalente fácil de escrever em JavaScript:
import nltk # is not in JavaScript
def processParagraph(text):
...
nltk calls
...
return lst # returns a list of strings (will be converted to JavaScript array)
javascript
python
function
integration
xralf
fonte
fonte
Respostas:
Tudo que você precisa é fazer uma solicitação ajax para seu código python. Você pode fazer isso com jquery http://api.jquery.com/jQuery.ajax/ ou usar apenas javascript
$.ajax({ type: "POST", url: "~/pythoncode.py", data: { param: text} }).done(function( o ) { // do something });
fonte
processParagraph(text)
para que os valores de retorno terminassem na variávelarrOfStrings
?[]
XMLHttpRequest cannot load file:~/pythoncode.py. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource
e mesmo sabendo qual é o problema, não sei como resolva isso. Qualquer ponteiro útil? Muito obrigado. (aliás ... chessheaven parece realmente incrível! Vou tentar com certeza, que bom que você colocou uma garota bonita em sua foto de perfil;))Do
document.getElementsByTagName
que eu acho que você está rodando o JavaScript em um navegador.A maneira tradicional de expor a funcionalidade do javascript em execução no navegador é chamar uma URL remota usando AJAX. OX em AJAX é para XML, mas hoje em dia todo mundo usa JSON em vez de XML.
Por exemplo, usando jQuery, você pode fazer algo como:
$.getJSON('http://example.com/your/webservice?param1=x¶m2=y', function(data, textStatus, jqXHR) { alert(data); } )
Você precisará implementar um serviço da web python no lado do servidor. Para serviços da web simples, gosto de usar o Flask .
Uma implementação típica se parece com:
@app.route("/your/webservice") def my_webservice(): return jsonify(result=some_function(**request.args))
Você pode executar IronPython (uma espécie de Python.Net) no navegador com silverlight , mas não sei se NLTK está disponível para IronPython.
fonte
Normalmente, você faria isso usando uma solicitação ajax que se parece com
var xhr = new XMLHttpRequest(); xhr.open("GET", "pythoncode.py?text=" + text, true); xhr.responseType = "JSON"; xhr.onload = function(e) { var arrOfStrings = JSON.parse(xhr.response); } xhr.send();
fonte
Você não pode executar arquivos .py em JavaScript sem o programa Python, da mesma forma que não pode abrir arquivos .txt sem um editor de texto. Mas tudo se transforma em um fôlego com a ajuda de um Web API Server (IIS no exemplo abaixo).
Instale o python e crie um arquivo de amostra test.py
import sys # print sys.argv[0] prints test.py # print sys.argv[1] prints your_var_1 def hello(): print "Hi" + " " + sys.argv[1] if __name__ == "__main__": hello()
Crie um método em seu servidor de API da Web
[HttpGet] public string SayHi(string id) { string fileName = HostingEnvironment.MapPath("~/Pyphon") + "\\" + "test.py"; Process p = new Process(); p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName + " " + id) { RedirectStandardOutput = true, UseShellExecute = false, CreateNoWindow = true }; p.Start(); return p.StandardOutput.ReadToEnd(); }
E agora para o seu JavaScript:
function processSayingHi() { var your_param = 'abc'; $.ajax({ url: '/api/your_controller_name/SayHi/' + your_param, type: 'GET', success: function (response) { console.log(response); }, error: function (error) { console.log(error); } }); }
Lembre-se de que seu arquivo .py não será executado no computador do usuário, mas sim no servidor.
fonte
Comunicação por meio de processos
Exemplo:
Python: este bloco de código Python deve retornar temperaturas aleatórias.
# sensor.py import random, time while True: time.sleep(random.random() * 5) # wait 0 to 5 seconds temperature = (random.random() * 20) - 5 # -5 to 15 print(temperature, flush=True, end='')
Javascript (Nodejs): aqui, precisaremos gerar um novo processo filho para executar nosso código Python e, em seguida, obter a saída impressa.
// temperature-listener.js const { spawn } = require('child_process'); const temperatures = []; // Store readings const sensor = spawn('python', ['sensor.py']); sensor.stdout.on('data', function(data) { // convert Buffer object to Float temperatures.push(parseFloat(data)); console.log(temperatures); });
fonte