英文:
Where is the definition of os.system() function?
问题
我在学习模式中——这可能是一个愚蠢的问题,但我还是要问:
我知道在Python的os.py中有一个system()函数,但我在GitHub上找不到它。
根据Python文档,它说:“这是通过调用标准C函数system()
来实现的,并具有相同的限制。”所以我的问题是:“这背后的机制是什么?”
代码:https://github.com/python/cpython/blob/3.11/Lib/os.py
英文:
I'm in learning mode---- this is probably a dumb question but here it is:
I know there is a system() function in os.py in python, but I can't find it in os.py in github.
According to python docs, it says that 'This is implemented by calling the Standard C function system()
, and has the same limitations.'.So my question is "What is the mechanism behind this?"
code : https://github.com/python/cpython/blob/3.11/Lib/os.py
答案1
得分: 1
这个函数是用C语言编写的。
这里的代码(来自cpython/Modules/posixmodule.c
)定义了os.system
。
#ifdef HAVE_SYSTEM
#ifdef MS_WINDOWS
/*[clinic input]
os.system -> long
command: Py_UNICODE
在子shell中执行命令。
[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
在子shell中执行命令。
[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语言编写它?” 答案很简单,C语言可以轻松与计算机进行交互,虽然Python也可以,但需要另一个C模块来从Python中执行这些操作。直接在C中编写这样的功能更容易、更美观,而且更快。
英文:
This function is written in C.
This code here (from cpython/Modules/posixmodule.c
) is where os.system
is defined.
#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 */
Notice the line that calls system(bytes)
. The system
function in C is apart of the standard C library, so if you wish to learn more about the C function, you can look there.
You might be wondering, "Why is it written in C?". The answer is simple, C can easily interact with you computer, and although Python can too, another C module would be required to do this from Python. It's easier, better looking, and faster to write something like this directly in C.
答案2
得分: -1
在 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
中正在寻找的内容 - 至少可以回答问题“为什么我在 os.py
中看不到这个?”。
posix - 最常见的 POSIX 系统调用模块
该模块提供对由C标准和POSIX标准(一个轻微伪装的Unix接口)标准化的操作系统功能的访问。
英文:
In os.py there is code to look for and import such system calls:
# 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
This may be what you were looking for in os.py
-- at least as far as answer the question why don't I see this in os.py?
posix - The most common POSIX system calls
> This module provides access to operating system functionality that is
> standardized by the C Standard and the POSIX standard (a thinly
> disguised Unix interface).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论