[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-15 Thread STINNER Victor


STINNER Victor  added the comment:

> Thanks! Indeed, that's an even better solution than I had in mind.
> It follows PEP 630 quite nicely: 
> https://www.python.org/dev/peps/pep-0630/#managing-global-state

The atexit module was my main motivation for this issue. So I'm fine with 
closing it.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-15 Thread Petr Viktorin


Petr Viktorin  added the comment:

Thanks! Indeed, that's an even better solution than I had in mind.
It follows PEP 630 quite nicely: 
https://www.python.org/dev/peps/pep-0630/#managing-global-state

I will close this issue and PRs.
I don't agree with adding a general API for disallowing multiple modules, but 
do let me know if you see a need for it again.

--
resolution:  -> not a bug
stage: patch review -> resolved
status: open -> closed

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-14 Thread STINNER Victor


STINNER Victor  added the comment:

I created bpo-42639 and PR 23763 to move the atexit module to 
PyInterpreterState and so allow to have more than one atexit instance.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-14 Thread STINNER Victor


Change by STINNER Victor :


--
pull_requests: +22619
pull_request: https://github.com/python/cpython/pull/23763

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread hai shi


hai shi  added the comment:

> another solution is to move the "module state" into the interpreter,

OK, I am agree victor's solution too. It's a more simpler way.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread Dong-hee Na


Change by Dong-hee Na :


--
pull_requests: +22566
pull_request: https://github.com/python/cpython/pull/23699

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread Dong-hee Na


Dong-hee Na  added the comment:

> another solution is to move the "module state" into the interpreter,

I am +1 on this solution if this module is a very special case.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread STINNER Victor


STINNER Victor  added the comment:

I'm not 100% sure that preventing to create multiple module instances is 
needed. For the atexit module, another solution is to move the "module state" 
into the interpreter, as it has been done for other modules like _warnings.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread Petr Viktorin


Petr Viktorin  added the comment:

Are there any other examples?

In my view, atexit is very special, and very closely tied to interpreter. I 
don't think it's good to design general API for one module.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread STINNER Victor


STINNER Victor  added the comment:

> static int loaded = 0;

I would like to limit an extension to once instance *per interpreter*.

See the atexit module for an example.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-08 Thread Petr Viktorin


Petr Viktorin  added the comment:

Is it really necessary to add a slot/flag for this?
It can be done in about 10 lines as below, without complications like a global 
(or per-interpreter) registry of singleton modules.
Are there many modules that need to be per-interpreter singletons, but may be 
loaded in multiple interpreters? In my experience, it is really hard to ensure 
modules behave that way; if (if!) we need to add a dedicated API for this, I'd 
go for once-per-process.


static int loaded = 0;

static int
exec_module(PyObject* module)
{
if (loaded) {
PyErr_SetString(PyExc_ImportError,
"cannot load module more than once per process");
return -1;
}
loaded = 1;
// ... rest of initialization
}

--
nosy: +petr.viktorin

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-07 Thread hai shi


hai shi  added the comment:

> MAYBE we need add a module flag in `PyModuleDef`.
I created a demo in PR 23683.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-07 Thread hai shi


Change by hai shi :


--
keywords: +patch
pull_requests: +22547
stage: test needed -> patch review
pull_request: https://github.com/python/cpython/pull/23683

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-12-07 Thread hai shi


hai shi  added the comment:

>On the other side, defining a Py_mod_exec_once that supports execution > >for 
>just once can be a way.
>Although the usage is little, it will be fine because the use case will >exist.

IMHO, `Py_mod_exec_once` is more like a slot control flag. MAYBE we need add a 
module flag in `PyModuleDef`.

--
versions: +Python 3.10 -Python 3.9

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-11-19 Thread hai shi


Change by hai shi :


--
nosy: +shihai1991

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-09-10 Thread mohamed koubaa


mohamed koubaa  added the comment:

Something like this?

```
static PyObject *def;

PyMODINIT_FUNC
PyInit_mymod(void)
{
if (def == NULL) {
   def = PyModuleDef_Init(&mymod);
}
return def;
}
```

Then add a flag to PyModuleDef to indicate it is already exec?

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-09-10 Thread STINNER Victor


STINNER Victor  added the comment:

One option is to get the behavior before multi-phase initialization. We store 
extensions in a list. Once it's load, it cannot be unloaded before we exit 
Python. See _PyState_AddModule() and _PyState_AddModule().

Calling PyInit_xxx() the second time would simply return the existing module 
object.

When we exit Python, the clear and/or free function of the module is called.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-09-10 Thread Dong-hee Na


Dong-hee Na  added the comment:

One of my opinions is that

Since module object supports detecting error during Py_mod_exec,
The only thing we have to do is return -1 when the module has already existed.

we should define new exception type and don't have to define new slots.
The pros of this method is that we don't have to modify module object and no 
needs to write the new PEP

but the cons of this method is that we should promise the standard exception 
when try to create multiple instances which is not allowed.

ref: 
https://github.com/python/cpython/blob/788b79fa7b6184221e68d4f1a3fbe0b3270693f6/Objects/moduleobject.c#L399

On the other side, defining a Py_mod_exec_once that supports execution for just 
once can be a way.
Although the usage is little, it will be fine because the use case will exist.

Please point out what I missed :)

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-09-07 Thread mohamed koubaa


mohamed koubaa  added the comment:

What about a new PyModuleDef_Slot function?


```
static int my_can_create(/*need any arg??, InterpreterState, etc?*/) {
if (test_global_condition()) {
return -1; //Don't allow creation
}
return 0; //Allow creation
};

static PyModuleDef_Slot signal_slots[] = {
{Py_mod_exec, my_exec},
{Py_mod_can_create, my_can_create},
{0,0}
};

```

--
nosy: +koubaa

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-05-18 Thread STINNER Victor


Change by STINNER Victor :


--
components: +Subinterpreters

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue40600] Add option to disallow > 1 instance of an extension module

2020-05-15 Thread Terry J. Reedy


Terry J. Reedy  added the comment:

Title clarified.  Leaving subinterpreters aside, only one instance, AFAIK, is 
true for stdlib and python modules unless imported with different names, as can 
happen with main module (which is a nuisance if not a bug).  So only once per 
interpreter seems like a bugfix.  Only once per process, if once per 
interpreter otherwise becomes normal, seems like an enhancement, even if a 
necessary option.

--
nosy: +terry.reedy
stage:  -> test needed
title: Add an option to disallow creating more than one instance of a module -> 
Add option to disallow > 1 instance of an extension module

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com