Я планирую создать приложение на основе XULRunner, которое должно взаимодействовать с Python. План состоит в том, чтобы использовать PyXPCOM. В настоящее время я учу себя использованию PyXPCOM и изучаю примерный компонент developmentmnet в Создание компонента Python XPCOM , но не могу заставить его работать.
Я использую Ubuntu 11.04, и мои шаги были:
Создал каталог приложения и скопировал в него мой двоичный дистрибутив XULRUnner 5.x в подкаталог xulrunner
Успешно построенный PyXPCOM после Сборка PyXPCOM
Следовал инструкциям по установке в исходном файле README.txt
PyXPCOM, скопировал все содержимое каталога obj/dist/bin
в мой подкаталог xulrunner
и добавил следующую строку в файл xulrunner/chrome.manifest
:
manifest components/pyxpcom.manifest
Создал файл nsIPySimple.idl
и поместил его в мое приложение components
Подкаталог:
#include "nsISupports.idl"
[scriptable, uuid(2b324e9d-a322-44a7-bd6e-0d8c83d94883)]
interface nsIPySimple : nsISupports {
attribute string yourName;
void write( );
void change(in string aValue);
};
Создал файл xpt, выполнив следующую команду в моем подкаталоге components
:
[xul-sdk-path]/xpidl -m typelib -w -v -I [xul-sdk-path]/idl/ nsIPySimple.idl
Создано nsIPySimple.py
в моем components
подкаталоге
from xpcom import components, verbose
class PySimple: #PythonTestComponent
_com_interfaces_ = components.interfaces.nsIPySimple
_reg_clsid_ = "{607ebc50-b8ba-11e0-81d9-001cc4c794e3}"
_reg_contractid_ = "@mozilla.org/PySimple;1"
def __init__(self):
self.yourName = "a default name" # or mName ?
def __del__(self):
if verbose:
print "PySimple: __del__ method called - object is destructing"
def write(self):
print self.yourName
def change(self, newName):
self.yourName = newName
PYXPCOM_CLASSES = [
PySimple,
]
Зарегистрировал код Python, добавив следующие строки в мой chrome.manifest
файл:
interfaces components/nsIPySimple.xpt
component {607ebc50-b8ba-11e0-81d9-001cc4c794e3} components/nsIPySimple.py
contract @mozilla.org/PySimple;1 {607ebc50-b8ba-11e0-81d9-001cc4c794e3}
Создана функция Javascript для вызова метода Python:
function showMore() {
try {
testComp = Components.classes["@mozilla.org/PySimple;1"].name;
alert(testComp);
testComp = Components.classes["@mozilla.org/PySimple;1"].
createInstance(Components.interfaces.nsIPySimple);
testComp.write();
}
catch (anError) {
alert(anError);
}
}
Но код Javascript выдает следующее исключение:
[Exception... "Component returned failure code: 0x80570015
(NS_ERROR_XPC_CI_RETURNED_FAILURE) [nsIJSCID.createInstance]"
nsresult: "0x80570015 (NS_ERROR_XPC_CI_RETURNED_FAILURE)"
location: "JS frame :: chrome://reader/content/main.js ::
showMore :: line 5" data: no]
Есть идеи, что случилось или что я сделал не так?
Спасибо за помощь и разъяснения!