python-3.x OS.system()函数的定义在哪里?

xxls0lw8  于 2023-05-30  发布在  Python
关注(0)|答案(2)|浏览(181)

我在学习模式----这可能是一个愚蠢的问题,但它是:我知道在python的www.example.com中有一个system()函数os.py,但在github的os.py中找不到。
根据python文档,它说“这是通过调用标准C函数system()实现的,并且具有相同的限制。”所以我的问题是“这背后的机制是什么?”
代码:https://github.com/python/cpython/blob/3.11/Lib/os.py

a8jjtwal

a8jjtwal1#

这个函数是用C写的。
这里的代码(来自cpython/Modules/posixmodule.c)是定义os.system的地方。

#ifdef HAVE_SYSTEM
#ifdef MS_WINDOWS
/*[clinic input]
os.system -> long

    command: Py_UNICODE

Execute the command in a subshell.
[clinic start generated code]*/

static long
os_system_impl(PyObject *module, const Py_UNICODE *command)
/*[clinic end generated code: output=5b7c3599c068ca42 input=303f5ce97df606b0]*/
{
    long result;

    if (PySys_Audit("os.system", "(u)", command) < 0) {
        return -1;
    }

    Py_BEGIN_ALLOW_THREADS
    _Py_BEGIN_SUPPRESS_IPH
    result = _wsystem(command);
    _Py_END_SUPPRESS_IPH
    Py_END_ALLOW_THREADS
    return result;
}
#else /* MS_WINDOWS */
/*[clinic input]
os.system -> long

    command: FSConverter

Execute the command in a subshell.
[clinic start generated code]*/

static long
os_system_impl(PyObject *module, PyObject *command)
/*[clinic end generated code: output=290fc437dd4f33a0 input=86a58554ba6094af]*/
{
    long result;
    const char *bytes = PyBytes_AsString(command);

    if (PySys_Audit("os.system", "(O)", command) < 0) {
        return -1;
    }

    Py_BEGIN_ALLOW_THREADS
    result = system(bytes);
    Py_END_ALLOW_THREADS
    return result;
}
#endif
#endif /* HAVE_SYSTEM */

请注意调用system(bytes)的行。C中的system函数是标准C库的一部分,所以如果你想了解更多关于C函数的信息,你可以去那里看看。
你可能会问:“为什么要用C写?”答案很简单,C可以很容易地与您的计算机交互,尽管Python也可以,但需要另一个C模块才能从Python中做到这一点。直接用C编写这样的代码更容易、更好看、更快。

4bbkushb

4bbkushb2#

在www.example.com中os.py,有代码可以查找和导入这样的系统调用:

# Any new dependencies of the os module and/or changes in path separator
# requires updating importlib as well.
if 'posix' in _names:
    name = 'posix'
    linesep = '\n'
    from posix import *
    try:
        from posix import _exit
        __all__.append('_exit')
    except ImportError:
        pass
    import posixpath as path

    try:
        from posix import _have_functions
    except ImportError:
        pass

    import posix
    __all__.extend(_get_exports_list(posix))
    del posix

这可能是您在os.py中寻找的内容--至少可以回答以下问题 * 为什么我在www.example.com中看不到这个内容os.py?*

posix -最常见的POSIX系统调用

这个模块提供了对由C标准和POSIX标准(一个几乎伪装的Unix接口)标准化的操作系统功能的访问。

相关问题