mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Implement PEP 338 which has been marked as accepted by GvR
This commit is contained in:
parent
8ea61f1a83
commit
e2ebb2d7f7
3 changed files with 625 additions and 42 deletions
|
@ -132,27 +132,42 @@ static void RunStartupFile(PyCompilerFlags *cf)
|
|||
}
|
||||
}
|
||||
|
||||
/* Get the path to a top-level module */
|
||||
static struct filedescr * FindModule(const char *module,
|
||||
FILE **fp, char **filename)
|
||||
|
||||
static int RunModule(char *module)
|
||||
{
|
||||
struct filedescr *fdescr = NULL;
|
||||
*fp = NULL;
|
||||
*filename = malloc(MAXPATHLEN);
|
||||
|
||||
if (*filename == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Find the actual module source code */
|
||||
fdescr = _PyImport_FindModule(module, NULL,
|
||||
*filename, MAXPATHLEN, fp, NULL);
|
||||
|
||||
if (fdescr == NULL) {
|
||||
free(*filename);
|
||||
*filename = NULL;
|
||||
PyObject *runpy, *runmodule, *runargs, *result;
|
||||
runpy = PyImport_ImportModule("runpy");
|
||||
if (runpy == NULL) {
|
||||
fprintf(stderr, "Could not import runpy module\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fdescr;
|
||||
runmodule = PyObject_GetAttrString(runpy, "run_module");
|
||||
if (runmodule == NULL) {
|
||||
fprintf(stderr, "Could not access runpy.run_module\n");
|
||||
Py_DECREF(runpy);
|
||||
return -1;
|
||||
}
|
||||
runargs = Py_BuildValue("sOsO", module,
|
||||
Py_None, "__main__", Py_True);
|
||||
if (runargs == NULL) {
|
||||
fprintf(stderr,
|
||||
"Could not create arguments for runpy.run_module\n");
|
||||
Py_DECREF(runpy);
|
||||
Py_DECREF(runmodule);
|
||||
return -1;
|
||||
}
|
||||
result = PyObject_Call(runmodule, runargs, NULL);
|
||||
if (result == NULL) {
|
||||
PyErr_Print();
|
||||
}
|
||||
Py_DECREF(runpy);
|
||||
Py_DECREF(runmodule);
|
||||
Py_DECREF(runargs);
|
||||
if (result == NULL) {
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(result);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Main program */
|
||||
|
@ -441,28 +456,9 @@ Py_Main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (module != NULL) {
|
||||
/* Backup _PyOS_optind and find the real file */
|
||||
struct filedescr *fdescr = NULL;
|
||||
/* Backup _PyOS_optind and force sys.arv[0] = module */
|
||||
_PyOS_optind--;
|
||||
if ((fdescr = FindModule(module, &fp, &filename))) {
|
||||
argv[_PyOS_optind] = filename;
|
||||
} else {
|
||||
fprintf(stderr, "%s: module %s not found\n",
|
||||
argv[0], module);
|
||||
return 2;
|
||||
}
|
||||
if (!fp) {
|
||||
fprintf(stderr,
|
||||
"%s: module %s has no associated file\n",
|
||||
argv[0], module);
|
||||
return 2;
|
||||
}
|
||||
if (!_PyImport_IsScript(fdescr)) {
|
||||
fprintf(stderr,
|
||||
"%s: module %s not usable as script\n (%s)\n",
|
||||
argv[0], module, filename);
|
||||
return 2;
|
||||
}
|
||||
argv[_PyOS_optind] = module;
|
||||
}
|
||||
|
||||
PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
|
||||
|
@ -481,9 +477,8 @@ Py_Main(int argc, char **argv)
|
|||
sts = PyRun_SimpleStringFlags(command, &cf) != 0;
|
||||
free(command);
|
||||
} else if (module) {
|
||||
sts = PyRun_AnyFileExFlags(fp, filename, 1, &cf) != 0;
|
||||
sts = RunModule(module);
|
||||
free(module);
|
||||
free(filename);
|
||||
}
|
||||
else {
|
||||
if (filename == NULL && stdin_is_interactive) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue