tcl/python interaction problem

Jean-Luc Fontaine jfontain at free.fr
Thu Nov 7 02:29:22 EST 2002


I am the author of the tclpython library, which, as its names implies
allows the embedding of python code inside tcl scripts.
I recently moved to redhat 8.0, which includes python 2.2.1 and tcl
8.3.3.
When I recompiled the tclpython library, I found it hanging when
creating a new python interpreter from tcl, as in:

  package require tclpython 2
  set i [python::interp new]
  # the above just hangs (never returns)

The tclpython library used to work before with both python 1.5 and
2.0.
I could simplify the code and traced it to the following:

--- tcl/python test library code ---
#include <Python.h>
#include <tcl.h>
int Ppp_Init(Tcl_Interp *interpreter)
{
    PyThreadState *state;
    Py_Initialize();
    PyEval_InitThreads();
    state = Py_NewInterpreter();
    return Tcl_PkgProvide(interpreter, "ppp", "1.0");
}
--- tcl test code ---
$ tclsh
> load ./ppp.so
-- strace -e trace=signal ---
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRTMIN, {0x404f191c, [], SA_RESTORER, 0x400ea238},
NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x404f0c68, [], SA_RESTORER, 0x400ea238}, NULL,
8) = 0
rt_sigaction(SIGRT_2, {0x404f19a4, [], SA_RESTORER, 0x400ea238}, NULL,
8) = 0
rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_IGN}, 8) = 0
rt_sigaction(SIGHUP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGILL, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTRAP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGABRT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGBUS, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGFPE, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGKILL, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGUSR1, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSEGV, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGUSR2, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPIPE, NULL, {SIG_IGN}, 8) = 0
rt_sigaction(SIGALRM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSTKFLT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGCONT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSTOP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTSTP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTTIN, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTTOU, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGURG, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGXCPU, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGXFSZ, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGVTALRM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPROF, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGWINCH, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGIO, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPWR, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_3, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_4, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_5, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_6, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_7, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_8, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_9, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_10, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_11, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_12, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_13, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_14, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_15, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_16, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_17, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_18, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_19, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_20, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_21, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_22, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_23, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_24, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_25, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_26, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_27, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_28, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_29, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_30, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_31, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, {0x404f58c4, [], SA_RESTORER, 0x400ea238}, NULL,
8) = 0
rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
rt_sigsuspend([] <unfinished ...>
--- hung right above ---


Then I made a simple test program using the same code, but launched
directly through the command line, not via the Tcl interprepreter:

--- C test code ---
#include <Python.h>
int main(int argv, char **argc) {
    PyThreadState *state;
    Py_Initialize();
    PyEval_InitThreads();
    state = Py_NewInterpreter();
    return 0;
}
-- strace -e trace=signal ---
rt_sigaction(SIGRTMIN, {0x4002591c, [], SA_RESTORER, 0x4011d238},
NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x40024c68, [], SA_RESTORER, 0x4011d238}, NULL,
8) = 0
rt_sigaction(SIGRT_2, {0x400259a4, [], SA_RESTORER, 0x4011d238}, NULL,
8) = 0
rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN}, {SIG_DFL}, 8) = 0
rt_sigaction(SIGHUP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGQUIT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGILL, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTRAP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGABRT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGBUS, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGFPE, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGKILL, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGUSR1, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSEGV, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGUSR2, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPIPE, NULL, {SIG_IGN}, 8) = 0
rt_sigaction(SIGALRM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTERM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSTKFLT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGCONT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSTOP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTSTP, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTTIN, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGTTOU, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGURG, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGXCPU, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGXFSZ, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGVTALRM, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPROF, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGWINCH, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGIO, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGPWR, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGSYS, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_3, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_4, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_5, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_6, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_7, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_8, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_9, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_10, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_11, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_12, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_13, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_14, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_15, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_16, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_17, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_18, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_19, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_20, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_21, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_22, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_23, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_24, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_25, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_26, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_27, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_28, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_29, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_30, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGRT_31, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, NULL, {SIG_DFL}, 8) = 0
rt_sigaction(SIGINT, {0x400298c4, [], SA_RESTORER, 0x4011d238}, NULL,
8) = 0
--- program finished normally ---


As you can see, the rt_sigprocmask() and rt_sigsuspend() calls never
occur in the later case and the program exits as expected.
When it hangs, in the tclpython library case, I traced it to the
following instruction in Python-2.2.1/Python/pythonrun.c source file:

static void
initsite(void)
{
    PyObject *m, *f;
    m = PyImport_ImportModule("site"); // <<< hangs here <<<
    if (m == NULL) {
    ...

I am just guessing that the problem is related to signals and threads...
I would really appreciate any pointers or hints to solve this problem.

Many thanks in advance,

Jean-Luc



More information about the Python-list mailing list