reinit python tab

This commit is contained in:
Miodrag Milanovic 2018-06-27 11:45:19 +02:00
parent 9bb4899360
commit bafb4702c7
7 changed files with 53 additions and 34 deletions

View File

@ -127,11 +127,9 @@ BOOST_PYTHON_MODULE(MODULE_NAME)
class_<Context, Context *, bases<Arch>, boost::noncopyable>("Context", no_init).def("checksum", &Context::checksum); class_<Context, Context *, bases<Arch>, boost::noncopyable>("Context", no_init).def("checksum", &Context::checksum);
} }
void arch_appendinittab() { PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); }
static wchar_t *program; static wchar_t *program;
void init_python(const char *executable) void init_python(const char *executable,bool first)
{ {
#ifdef MAIN_EXECUTABLE #ifdef MAIN_EXECUTABLE
program = Py_DecodeLocale(executable, NULL); program = Py_DecodeLocale(executable, NULL);
@ -140,10 +138,14 @@ void init_python(const char *executable)
exit(1); exit(1);
} }
try { try {
if (first)
{
PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME); PyImport_AppendInittab(TOSTRING(MODULE_NAME), PYINIT_MODULE_NAME);
emb::append_inittab(); emb::append_inittab();
}
Py_SetProgramName(program); Py_SetProgramName(program);
Py_Initialize(); Py_Initialize();
if (first)
PyImport_ImportModule(TOSTRING(MODULE_NAME)); PyImport_ImportModule(TOSTRING(MODULE_NAME));
} catch (boost::python::error_already_set const &) { } catch (boost::python::error_already_set const &) {
// Parse and output the exception // Parse and output the exception

View File

@ -100,14 +100,12 @@ template <typename Tn> void python_export_global(const char *name, Tn &x)
} }
}; };
void init_python(const char *executable); void init_python(const char *executable, bool first);
void deinit_python(); void deinit_python();
void execute_python_file(const char *python_file); void execute_python_file(const char *python_file);
void arch_appendinittab();
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END
#endif /* end of include guard: COMMON_PYBINDINGS_HH */ #endif /* end of include guard: COMMON_PYBINDINGS_HH */

View File

@ -92,11 +92,6 @@ int main(int argc, char *argv[])
Context ctx(ArchArgs{}); Context ctx(ArchArgs{});
#ifndef NO_PYTHON
init_python(argv[0]);
python_export_global("ctx", ctx);
#endif
if (vm.count("verbose")) { if (vm.count("verbose")) {
ctx.verbose = true; ctx.verbose = true;
} }
@ -111,9 +106,14 @@ int main(int argc, char *argv[])
#ifndef NO_PYTHON #ifndef NO_PYTHON
if (vm.count("run")) { if (vm.count("run")) {
init_python(argv[0], true);
python_export_global("ctx", ctx);
std::vector<std::string> files = vm["run"].as<std::vector<std::string>>(); std::vector<std::string> files = vm["run"].as<std::vector<std::string>>();
for (auto filename : files) for (auto filename : files)
execute_python_file(filename.c_str()); execute_python_file(filename.c_str());
deinit_python();
} }
#endif #endif
@ -125,9 +125,6 @@ int main(int argc, char *argv[])
rc = a.exec(); rc = a.exec();
} }
#endif
#ifndef NO_PYTHON
deinit_python();
#endif #endif
return rc; return rc;
} catch (log_execution_error_exception) { } catch (log_execution_error_exception) {

View File

@ -74,7 +74,9 @@ BaseMainWindow::BaseMainWindow(QWidget *parent) : QMainWindow(parent), ctx(nullp
tabWidget = new QTabWidget(); tabWidget = new QTabWidget();
#ifndef NO_PYTHON #ifndef NO_PYTHON
tabWidget->addTab(new PythonTab(), "Python"); PythonTab *pythontab = new PythonTab();
tabWidget->addTab(pythontab, "Python");
connect(this, SIGNAL(contextChanged(Context*)), pythontab, SLOT(newContext(Context*)));
#endif #endif
info = new InfoTab(); info = new InfoTab();
tabWidget->addTab(info, "Info"); tabWidget->addTab(info, "Info");

View File

@ -25,10 +25,8 @@
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
PythonTab::PythonTab(QWidget *parent) : QWidget(parent) PythonTab::PythonTab(QWidget *parent) : QWidget(parent),initialized(false)
{ {
PyImport_ImportModule("emb");
// Add text area for Python output and input line // Add text area for Python output and input line
plainTextEdit = new QPlainTextEdit(); plainTextEdit = new QPlainTextEdit();
plainTextEdit->setReadOnly(true); plainTextEdit->setReadOnly(true);
@ -57,7 +55,25 @@ PythonTab::PythonTab(QWidget *parent) : QWidget(parent)
setLayout(mainLayout); setLayout(mainLayout);
connect(lineEdit, SIGNAL(textLineInserted(QString)), this, SLOT(editLineReturnPressed(QString))); connect(lineEdit, SIGNAL(textLineInserted(QString)), this, SLOT(editLineReturnPressed(QString)));
}
PythonTab::~PythonTab()
{
if (initialized)
deinit_python();
}
void PythonTab::newContext(Context *ctx)
{
if (initialized)
deinit_python();
plainTextEdit->clear();
init_python("nextpnr", !initialized);
python_export_global("ctx", ctx);
PyImport_ImportModule("emb");
write = [this](std::string s) { write = [this](std::string s) {
plainTextEdit->moveCursor(QTextCursor::End); plainTextEdit->moveCursor(QTextCursor::End);
plainTextEdit->insertPlainText(s.c_str()); plainTextEdit->insertPlainText(s.c_str());
@ -65,6 +81,8 @@ PythonTab::PythonTab(QWidget *parent) : QWidget(parent)
}; };
emb::set_stdout(write); emb::set_stdout(write);
initialized = true;
char buff[1024]; char buff[1024];
sprintf(buff, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform()); sprintf(buff, "Python %s on %s\n", Py_GetVersion(), Py_GetPlatform());
print(buff); print(buff);
@ -120,11 +138,14 @@ int PythonTab::executePython(std::string &command)
} }
void PythonTab::editLineReturnPressed(QString text) void PythonTab::editLineReturnPressed(QString text)
{
if (initialized)
{ {
std::string input = text.toStdString(); std::string input = text.toStdString();
print(std::string(">>> " + input + "\n")); print(std::string(">>> " + input + "\n"));
executePython(input); executePython(input);
} }
}
void PythonTab::showContextMenu(const QPoint &pt) { contextMenu->exec(mapToGlobal(pt)); } void PythonTab::showContextMenu(const QPoint &pt) { contextMenu->exec(mapToGlobal(pt)); }

View File

@ -37,6 +37,7 @@ class PythonTab : public QWidget
public: public:
explicit PythonTab(QWidget *parent = 0); explicit PythonTab(QWidget *parent = 0);
~PythonTab();
private: private:
void print(std::string line); void print(std::string line);
@ -45,12 +46,14 @@ class PythonTab : public QWidget
void editLineReturnPressed(QString text); void editLineReturnPressed(QString text);
void showContextMenu(const QPoint &pt); void showContextMenu(const QPoint &pt);
void clearBuffer(); void clearBuffer();
public Q_SLOTS:
void newContext(Context *ctx);
private: private:
QPlainTextEdit *plainTextEdit; QPlainTextEdit *plainTextEdit;
LineEditor *lineEdit; LineEditor *lineEdit;
QMenu *contextMenu; QMenu *contextMenu;
emb::stdout_write_type write; emb::stdout_write_type write;
bool initialized;
}; };
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -269,11 +269,6 @@ int main(int argc, char *argv[])
Context ctx(chipArgs); Context ctx(chipArgs);
#ifndef NO_PYTHON
init_python(argv[0]);
python_export_global("ctx", ctx);
#endif
if (vm.count("verbose")) { if (vm.count("verbose")) {
ctx.verbose = true; ctx.verbose = true;
} }
@ -390,9 +385,14 @@ int main(int argc, char *argv[])
#ifndef NO_PYTHON #ifndef NO_PYTHON
if (vm.count("run")) { if (vm.count("run")) {
init_python(argv[0], true);
python_export_global("ctx", ctx);
std::vector<std::string> files = vm["run"].as<std::vector<std::string>>(); std::vector<std::string> files = vm["run"].as<std::vector<std::string>>();
for (auto filename : files) for (auto filename : files)
execute_python_file(filename.c_str()); execute_python_file(filename.c_str());
deinit_python();
} }
#endif #endif
@ -405,10 +405,6 @@ int main(int argc, char *argv[])
rc = a.exec(); rc = a.exec();
} }
#endif #endif
#ifndef NO_PYTHON
deinit_python();
#endif
return rc; return rc;
} catch (log_execution_error_exception) { } catch (log_execution_error_exception) {
#if defined(_MSC_VER) #if defined(_MSC_VER)