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
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? –
Désolé j'ai mal compris votre question, j'ai édité ma réponse! – JLS
Veuillez vous reporter à 'EDITED_2'. –