4 votes

Exécuter un script python depuis nodejs et renvoyer du json en retour

Je lance un script python script en utilisant python-shell. Le script python (nommé combine.py) renvoie des données au format json. Mais le code fonctionne bien sur ma machine locale mais pas sur l'instance aws. J'obtiens l'erreur suivante dans les logs de pm2 :

SyntaxError: Unexpected token / in JSON at position 0
1|app      |     at JSON.parse (<anonymous>)
1|app      |     at PythonShell.asJson (/home/ubuntu/toolCaseWebsite/node_modules/python-shell/index.js:358:21)
1|app      |     at /home/ubuntu/toolCaseWebsite/node_modules/python-shell/index.js:310:42
1|app      |     at Array.forEach (<anonymous>)
1|app      |     at PythonShell.recieveInternal (/home/ubuntu/toolCaseWebsite/node_modules/python-shell/index.js:306:15)
1|app      |     at PythonShell.receiveStderr (/home/ubuntu/toolCaseWebsite/node_modules/python-shell/index.js:290:21)
1|app      |     at Socket.<anonymous> (/home/ubuntu/toolCaseWebsite/node_modules/python-shell/index.js:108:18)
1|app      |     at Socket.emit (events.js:182:13)
1|app      |     at Socket.EventEmitter.emit (domain.js:442:20)
1|app      |     at addChunk (_stream_readable.js:279:12)

Je me suis assuré que python script renvoie des données json valides en plaçant d'abord les données dans un fichier et en vérifiant ensuite ces données via un validateur json en ligne.

Nodejs (fichier javascript)

  var ps = require('python-shell')
  noOfLines = 2
  noOfClusters = 5
  var options = {
    mode: 'json',
    pythonOptions: ['-u'], // get print results in real-time
    scriptPath: './pythonScripts/',
    args: [noOfClusters, noOfLines, processingData]
  }

  ps.PythonShell.run('combine2.py', options, function(err, results) {
    if (err) throw err
    // Results is an array consisting of messages collected during executio n
    //console.log(results)

    // Data send to index_timeline
    res.render('index_timeline', {
      results: results[0]
    })

    fs.writeFile('myOutput.txt', JSON.stringify(results, 0, 2), err => {
      // throws an error, you could also catch it here
      if (err) throw err

      // success case, the file was saved
      console.log('File saved!')
    })
  })

Python script(combine.py)

if __name__ == "__main__":

   # getting parameters
    content = sys.argv[3]
    nclusters= int(sys.argv[1])
    noOfLines=int(sys.argv[2])

    data={"clusters":[]}

    # Data Cleaning and then splitting into sentences

    sentences = dataCleaning(content).split('.')#splitting sentences on basis of comma rather fullstop
    sentences = list(filter(None, sentences))

    temp=list()
    myDict=dict()
    summarizing=str()

    #getting clusters
    clusters = cluster_sentences(sentences, nclusters)

    for cluster in range(nclusters):
        for i,sentence in enumerate(clusters[cluster]):
            temp.append(sentences[sentence])
            summarizing+=sentences[sentence]+". "
        myDict["sentences"]=list(temp)
        sentence_tokens, word_tokens = tokenize_content(summarizing)
        sentence_ranks = score_tokens(word_tokens, sentence_tokens)
        myDict["summary"]=str(summarize(sentence_ranks, sentence_tokens,noOfLines))
        data["clusters"].append(dict(myDict))
        myDict.clear()
        del temp[:]
        summarizing=''

    print(json.dumps(data))

myOutput.txt(données que j'ai écrites dans le fichier txt ci-dessus)

[
  {
    "clusters": [
      {
        "sentences": [
          " Qoum &amp; Maa Baap K Duaon Se Award Haasil Kiya",
          " Qoum &amp; Maa Baap K Duaon Se Award Haasil Kiya",
          " Qoum &amp; Maa Baap K Duaon Se Award Haasil Kiya"
        ],
        "summary": " Qoum &amp; Maa Baap K Duaon Se Award Haasil Kiya. Qoum &amp; Maa Baap K Duaon Se Award Haasil Kiya."
      },
      {
        "sentences": [
          " Mushtaq Ahmed",
          " Mushtaq Ahmed",
          " Mushtaq Ahmed NIJAMHAMY"
        ],
        "summary": " Mushtaq Ahmed. Mushtaq Ahmed NIJAMHAMY."
      }
    ]
  }
]

2voto

Abhas Tandon Points 1189

Cette erreur peut survenir si un contenu autre que JSON a été écrit sur stdout, ce qui a pour effet d'augmenter le nombre d'utilisateurs de l'application. python-shell a essayé de l'analyser en JSON. En mode JSON, toutes les données de sortie doivent être encodées en JSON, avec des retours chariot pour séparer les messages.

Essayez d'exécuter votre code python en tant que script autonome et assurez-vous qu'il n'y a pas de sortie supplémentaire (par exemple, une nouvelle ligne).

Il est très probable que votre code python envoie en sortie un caractère de ligne vide que le nœud essaie d'analyser en tant que JSON.parse("/\n") ce qui a conduit à cette erreur.

Uncaught SyntaxError: Unexpected token / in JSON at position 0
    at JSON.parse

0voto

Taha Asif Points 116

Merci beaucoup. Le problème était à peu près similaire. Le serveur renvoyait un avertissement concernant la dépréciation future de certains modules. C'est pourquoi python-shell ne recevait pas les données au format json. En ajoutant des options de ligne de commande pour ignorer les avertissements, j'ai pu exécuter ce code sur le serveur également

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X