Steve Dower <[email protected]> added the comment:
Thanks, Victor, that's great information.
> Memory allocator, context, different structures for configuration... it's
> really not an easy topic :-( There are so many constraints put into a single
> API!
This is why I'm keen to design the ideal *user* API first (that is, write the
examples of how you would use it) and then figure out how we can make it fit.
It's kind of the opposite approach from what you've been doing to adapt the
existing code to suit particular needs.
For example, imagine instead of all the PySet*() functions followed by
Py_Initialize() you could do this:
PyObject *runtime = PyRuntime_Create();
/* optional calls */
PyRuntime_SetAllocators(runtime, &my_malloc, &my_realloc, &my_free);
PyRuntime_SetHashSeed(runtime, 12345);
/* sets this as the current runtime via a thread local */
auto old_runtime = PyRuntime_Activate(runtime);
assert(old_runtime == NULL)
/* pretend triple quoting works in C for a minute ;) */
const char *init = """
import os.path
import sys
sys.executable = argv0
sys.prefix = os.path.dirname(argv0)
sys.path = [os.getcwd(), sys.prefix, os.path.join(sys.prefix, "Lib")]
pyvenv = os.path.join(sys.prefix, "pyvenv.cfg")
try:
with open(pyvenv, "r", encoding="utf-8") as f: # *only* utf-8 support
at this stage
for line in f:
if line.startswith("home"):
sys.path.append(line.partition("=")[2].strip())
break
except FileNotFoundError:
pass
if sys.platform == "win32":
sys.stdout = open("CONOUT$", "w", encoding="utf-8")
else:
# no idea if this is right, but you get the idea
sys.stdout = open("/dev/tty", "w", encoding="utf-8")
""";
PyObject *globals = PyDict_New();
/* only UTF-8 support at this stage */
PyDict_SetItemString(globals, "argv0", PyUnicode_FromString(argv[0]));
PyRuntime_Initialize(runtime, init_code, globals);
Py_DECREF(globals);
/* now we've initialised, loading codecs will succeed if we can find them
or fail if not,
* so we'd have to do cleanup to avoid depending on them without the user
being able to
* avoid it... */
PyEval_EvalString("open('file.txt', 'w', encoding='gb18030').close()");
/* may as well reuse DECREF for consistency */
Py_DECREF(runtime);
Maybe it's a terrible idea? Honestly I'd be inclined to do other big changes at
the same time (make PyObject opaque and interface driven, for example).
My point is that if the goal is to "move the existing internals around" then
that's all we'll ever achieve. If we can say "the goal is to make this example
work" then we'll be able to do much more.
----------
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue22213>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com