2017-09-07 4 views
3

Je veux installer un paquet avec un script python. J'ai lu la documentation sur l'API PackageManager (http://doc.aldebaran.com/2-4/naoqi/core/packagemanager-api.html):Comment installer des paquets avec des scripts python

J'ai donc emballé l'application avec Choregraph comme il est décrit dans http://doc.aldebaran.com/2-4/naoqi/core/packagemanager.html et j'ai essayé de l'installer avec un script python qui ressemble à:

import qi 
import sys 


if __name__ == '__main__': 
    ip = "11.1.11.111" 
    port = 9559 

    session = qi.Session() 
    try: 
     session.connect("tcp://" + ip + ":" + str(port)) 
    except RuntimeError: 
     print ("Can't connect to Naoqi at ip \"" + ip + "\" on port " + str(port)) 
     sys.exit(1) 

    service = session.service("PackageManager") 

    package = "C:\\test_package_handlers_01-835a92-1.0.0.pkg" 

    # this is to see if the problem is that python can not locate the file 
    with open(package) as f: 
     print f 

    service.install(package) 

et voici ce que je reçois comme une erreur:

# provided package could be opened 
<open file 'C:\\test_package_handlers_01-835a92-1.0.0.pkg', mode 'r' at 0x02886288> 
Traceback (most recent call last): 
    File "C:/test.py", line 24, in <module> 
    service.install(package) 
RuntimeError: C:\test_package_handlers_01-835a92-1.0.0.pkg: no such file 

Je suppose que cela est parce que le paquet doit être téléchargé sur le robot et le chemin du fichier de package doit être celui qui est sur le robot.

ÉDITÉ

J'ai ajouté le paquet à un projet vide choreographe et exécuter ce projet en blanc sur le robot. De cette façon, le paquet a été sauvegardé sur le robot avec le chemin /home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/test_package_handlers_01-835a92-1.0.0.pkg et quand j'ai changé le chemin dans mon script ("C:\\test_package_handlers_01-835a92-1.0.0.pkg" avec "/home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/test_package_handlers_01-835a92-1.0.0.pkg") le script a fonctionné comme prévu et le paquet a été installé sur le robot.

Y a-t-il un moyen d'installer des paquets depuis mon PC sans les télécharger sur le robot, sinon il est préférable d'utiliser Choregraphe pour télécharger des projets.

Peut-être qu'il est bon de donner l'explication suivante de ce que je veux atteindre:

  • J'ai un dossier sur mon PC avec 20 paquets par exemple
  • Je veux installer tous les 20 paquets avec un script python
  • il y a un script python qui installe tous les paquets à partir du dossier quand il est appelé comme ceci: python package_installer.py path_to_packages_folder

EDITED_2

import qi 
import ftplib 
import os 

ROBOT_URL = "10.80.129.90" 

print "Uploading PKG" 
pkg_file = "my-application-0.0.1.pkg" 
pkg_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), pkg_file) 

ftp = ftplib.FTP(ROBOT_URL) 
ftp.login("nao", "nao") 
with open(pkg_path) as pkg: 
    ftp.storbinary("STOR "+pkg_file, pkg) 

print "Connecting NAOqi session" 
app = qi.Application(url='tcp://'+ROBOT_URL+':9559') 
app.start() 
session = app.session 

print "Installing app" 
packagemgr = session.service("PackageManager") 
packagemgr.install("/home/nao/"+pkg_file) 

print "Cleaning robot" 
ftp.delete(pkg_file) 
ftp.quit() 

print "End" 
app.stop() 

Ce morceau de code ftp = ftplib.FTP(ROBOT_URL) lève l'exception suivante:

Traceback (most recent call last): 
    File "C:/Stefan/DSK_PEPPER_clode_2/PythonScripts/_local_testing/uploading_and_installing_package.py", line 11, in <module> 
    ftp = ftplib.FTP(ROBOT_URL) 
    File "C:\Python27\lib\ftplib.py", line 120, in __init__ 
    self.connect(host) 
    File "C:\Python27\lib\ftplib.py", line 135, in connect 
    self.sock = socket.create_connection((self.host, self.port), self.timeout) 
    File "C:\Python27\lib\socket.py", line 575, in create_connection 
    raise err 
socket.error: [Errno 10061] No connection could be made because the target machine actively refused it 

également lorsque je connecte au robot avec le nom d'utilisateur 'nao' et passe 'nao' comme décrit dans http://doc.aldebaran.com/2-5/dev/tools/opennao.html et puis essayez de créer un dossier dans /home/nao/.local/share/PackageManager/apps/ avec sudo mkdir il m'informe que: Sorry, user nao is not allowed to execute '/bin/mkdir dasdas' as root on Pepper.. Si je n'utilise que mkdir voici ce qu'il me dit: mkdir: cannot create directory 'new_folder': Permission denied

Répondre

1

Vous avez en effet besoin de télécharger le fichier auparavant. Vous pouvez utiliser scp ou sftp pour ce faire. Une fois que le .pkg est sur le robot, vous pouvez utiliser PackageManager.install.

Imaginez quelque chose comme:

import qi 
import paramiko 
import os 

ROBOT_URL = "10.80.129.90" 

print "Uploading PKG" 
pkg_file = "my-application-0.0.1.pkg" 
pkg_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), pkg_file) 

transport = paramiko.Transport((ROBOT_URL, 22)) 
transport.connect(username="nao", password="nao") 
sftp = paramiko.SFTPClient.from_transport(transport) 
sftp.put(pkg_path, pkg_file) 

print "Connecting NAOqi session" 
app = qi.Application(url='tcp://'+ROBOT_URL+':9559') 
app.start() 
session = app.session 

print "Installing app" 
packagemgr = session.service("PackageManager") 
packagemgr.install("/home/nao/"+pkg_file) 

print "Cleaning robot" 
sftp.remove(pkg_file) 
sftp.close() 
transport.close() 

print "End" 
app.stop() 
+0

Je ne suis pas sûr que j'ai eu l'idée: 1. Quel type de service puis-je créer ? 2. Quand je mets mon script dans le projet Choregraphe et que je modifie le fichier manifest.xml comme vous le suggérez Comment va installer le paquet? 3. Peut-être que j'ai exprimé ma requête un peu ambigu - s'il vous plaît voir le modifier? –

+0

Désolé j'ai mal compris votre question, j'ai édité ma réponse! – JLS

+0

Veuillez vous reporter à 'EDITED_2'. –

2

En utilisant qibuild, vous pouvez également installer directement à l'aide:

qipkg deploy-package /path/to/my-package.pkg --url [email protected]