[英]How to install packages with python scripts
我想使用python腳本安裝軟件包。 我已經閱讀了關於PackageManager API的文檔( http://doc.aldebaran.com/2-4/naoqi/core/packagemanager-api.html ):
因此,我將應用程序與choregraphe打包在一起,如http://doc.aldebaran.com/2-4/naoqi/core/packagemanager.html中所述,並且我嘗試使用如下所示的python腳本進行安裝:
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)
這是我收到的錯誤消息:
# 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
我猜這是因為必須將軟件包上載到機器人上,並且軟件包文件路徑必須是機器人上的文件路徑。
已編輯
我已將軟件包添加到Choreographe空白項目中,並在機器人上運行了該空白項目。 這樣,包被保存到與路徑機器人/home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/test_package_handlers_01-835a92-1.0.0.pkg
,當我在我的腳本已經改變了路徑( "C:\\\\test_package_handlers_01-835a92-1.0.0.pkg"
和"/home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/test_package_handlers_01-835a92-1.0.0.pkg"
),腳本按預期工作並將軟件包安裝在機器人上。
因此,有一種方法可以從我的PC安裝軟件包而不將其上傳到機械手,因為否則最好使用Choregraphe上載項目。
對我要實現的目標給出以下解釋也許是一件好事:
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()
這段代碼ftp = ftplib.FTP(ROBOT_URL)
引發以下異常:
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
同樣,當我使用用戶名“ nao”連接到機器人並按照http://doc.aldebaran.com/2-5/dev/tools/opennao.html中的說明傳遞“ nao”,然后嘗試在/home/nao/.local/share/PackageManager/apps/
創建文件夾/home/nao/.local/share/PackageManager/apps/
帶有sudo mkdir
它通知我: Sorry, user nao is not allowed to execute '/bin/mkdir dasdas' as root on Pepper.
。 如果我僅使用mkdir
,這將告訴我: mkdir: cannot create directory 'new_folder': Permission denied
使用qibuild ,您還可以使用以下命令直接安裝:
qipkg deploy-package /path/to/my-package.pkg --url nao@10.10.23.45
您確實確實需要先上傳文件。 您可以使用scp
或sftp
來執行此操作。 將.pkg
放置在機械PackageManager.install
后,即可使用PackageManager.install
。
想象一下:
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.