Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止sys.exit(N)在嵌入式python中完成整个过程?_Python_Interpreter - Fatal编程技术网

如何防止sys.exit(N)在嵌入式python中完成整个过程?

如何防止sys.exit(N)在嵌入式python中完成整个过程?,python,interpreter,Python,Interpreter,我在我的应用程序中使用嵌入式python解释器(iOS将详细说明) 有时在解释脚本中调用sys.exit(1),它会完成整个应用程序过程,而不是停止PyObject\u callObject()调用。我尝试使用PyErr\u来检查错误,但没有帮助 如何防止sys.exit(N)在嵌入式python中完成整个过程 NSString *outputFile = nil; for (int i=0; i<args.count; i++) { if ([@"-o" isEqualToStr

我在我的应用程序中使用嵌入式python解释器(iOS将详细说明)

有时在解释脚本中调用
sys.exit(1)
,它会完成整个应用程序过程,而不是停止
PyObject\u callObject()
调用。我尝试使用
PyErr\u来检查错误,但没有帮助

如何防止sys.exit(N)在嵌入式python中完成整个过程

NSString *outputFile = nil;
for (int i=0; i<args.count; i++) {
    if ([@"-o" isEqualToString:args[i]]) {
        outputFile = args[i + 1];
        break;
    }
}

PyEval_AcquireLock();
PyThreadState *subState = Py_NewInterpreter();

PyObject *pModuleName, *pModule, *pFunc;

// init python
NSString *pythonHome = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/"];

Py_SetProgramName("python");
char *cPythonHome = (char*)[pythonHome UTF8String];

setenv("PYTHONPATH", cPythonHome, 1); // VERY IMPORTANT !!!
Py_SetPythonHome(cPythonHome);

NSString *libsPath = [pythonHome stringByAppendingString:@"lib/python2.7"];

if (!Py_IsInitialized())
    Py_Initialize();

// invoke
int result = 0;

NSString *scriptFilename = args[1];
NSString *moduleName = [[scriptFilename lastPathComponent] stringByDeletingPathExtension];

pModuleName = PyString_FromString([moduleName UTF8String]); // module (script) name
pModule = PyImport_Import(pModuleName);

if (PyErr_Occurred())
    PyErr_Print();

if (pModule != NULL) {
    pFunc = PyObject_GetAttrString(pModule, "main__"); // module must have "def main__(args)"

    if (pFunc != NULL && PyCallable_Check(pFunc)) {

        // prepare args
        PyObject *pArgs = PyList_New(args.count-1);
        for (int i=0; i<args.count-1; i++) {
            NSString *arg_i = args[i + 1]; // skip first argument (it's program name)
            PyObject *pEachArg = PyString_FromString([arg_i UTF8String]);
            PyList_SetItem(pArgs, i, pEachArg);
            // WARNING: don't Py_DECREF for each argument
        }

        // for some reason arguments should be passed as s Tuple
        PyObject *pTuple = PyTuple_New(1);
        PyTuple_SetItem(pTuple, 0, pArgs);

        // call func
        NSLog(@"Invoke %@ via main__(args)", scriptFilename);
        PyObject *pyResult = PyObject_CallObject(pFunc, pTuple); // process killed here !

        if (pyResult == NULL || PyErr_Occurred()) {
            // print error
            PyErr_Print();

            // fix error
            PyErr_Clear();
            if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
                result = 3; // error: system.exit() called
            } else
                result = 4; // error: unknown exception
        }

        if (pyResult != NULL)
            Py_DECREF(pyResult);

        Py_DECREF(pTuple);
        Py_DECREF(pArgs);
    } else
        result = 2; // error: can't find "def main__()" in module

    if (pFunc != NULL)
        Py_XDECREF(pFunc);
} else
    result = 1; // error: can't import module

if (pModule != NULL)
    Py_DECREF(pModule);

Py_DECREF(pModuleName);

// restore parent interpreter
Py_EndInterpreter(subState);

PyEval_ReleaseLock();
NSString*outputFile=nil;

对于(int i=0;i我必须破解Python源代码并创建自己的函数:

int MyPyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)
{
    PyObject *m, *d, *v;
    const char *ext;
    int set_file_name = 0, ret, len;

    m = PyImport_AddModule("__main__");
    if (m == NULL)
        return -1;
    d = PyModule_GetDict(m);
    if (PyDict_GetItemString(d, "__file__") == NULL) {
        PyObject *f = PyString_FromString(filename);
        if (f == NULL)
            return -1;
        if (PyDict_SetItemString(d, "__file__", f) < 0) {
            Py_DECREF(f);
            return -1;
        }
        set_file_name = 1;
        Py_DECREF(f);
    }
    len = strlen(filename);
    ext = filename + len - (len > 4 ? 4 : 0);

    /*
    if (maybe_pyc_file(fp, filename, ext, closeit)) {
        // Try to run a pyc file. First, re-open in binary
        if (closeit)
            fclose(fp);
        if ((fp = fopen(filename, "rb")) == NULL) {
            fprintf(stderr, "python: Can't reopen .pyc file\n");
            ret = -1;
            goto done;
        }
        // Turn on optimization if a .pyo file is given
        if (strcmp(ext, ".pyo") == 0)
            Py_OptimizeFlag = 1;
        v = run_pyc_file(fp, filename, d, d, flags);
    } else { */
        v = PyRun_FileExFlags(fp, filename, Py_file_input, d, d,
                              closeit, flags);
    //}

    if (v == NULL) {
        //PyErr_Print(); // crashed here!
        ret = -1;
        goto done;
    }
    Py_DECREF(v);
    if (Py_FlushLine())
        PyErr_Clear();
    ret = 0;
done:
    if (set_file_name && PyDict_DelItemString(d, "__file__"))
        PyErr_Clear();
    return ret;
}

如果您有更好的解决方案,请告诉我们。

有人吗?有解决方案吗?
if (PyErr_Occurred()) {
        pythonSuccess = NO;

        if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
            NSLog(@"sys.exit() in python");
        } else {
            // print error
            PyErr_Print();
        }
        // fix error
        PyErr_Clear();
    }