python 中 os.system 的本质

pyinstaller - 代码中使用os.system() os.popen() 打包后找不到模块的问题 困扰了半天终于理顺了 之所以找不到对应的模块 是因为os.system() 使用的是当前系统的搜索路径 如虚拟环境中有 真实环境中没有 或者是发给其他用户使用 均会提示对应错误 解决的根源 在于给系统增加上对应的搜索路径 即 sys.path.insert(0, path) 或 sys.path.append() 参考代码如下 # 在生产新文件的最上方 导入对应模块 # 生成文件 text_content = """# cython: language_level=3 import s... 阅读详情

python 中 os 模块用得比较多,但 os.system 实际上是怎么调用 shell 命令的呢?简单来探寻一下。

1、系统环境

macos 10.15.6      x86_64
python 3.8.5

为什么要强调系统环境,因为 python 在不同系统版本上实现可能会有差异,待会讲解就能发现了。

2、os 模块

通过 help(os) 可以找到源文件查看,
image
下面截取相关代码来看(直接用注释解释了):

# 返回一个包含内建模块名字的元组,包含所有已经编译到Python解释器的模块名字
_names = sys.builtin_module_names
# __all__ 只影响到了 from <module> import * 这种导入方式
def _get_exports_list(module):
    try:
        return list(module.__all__)
    except AttributeError:
        return [n for n in dir(module) if n[0] != '_']
# 判断当前操作系统类型
# posix代表类Unix系统,nt表示Windows系统
# 我们的 macOS 就是类Unix系统,只截取这部分代码
if 'posix' in _names:
    name = 'posix' # 表示操作系统类型
    linesep = '\n' # 定义了当前平台使用的行终止符
    # os模块其实就是对posix或nt模块的二次封装,这样的好处就是实现了对不同平台的兼容
    from posix import *
    try:
        from posix import _exit
        __all__.append('_exit')
    except ImportError:
        pass
    import posixpath as path # 我们常用的os.path实际上是ntpath或者posixpath模块

    try:
        from posix import _have_functions
    except ImportError:
        pass

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

现在我们知道了在 macos 平台上,os 模块实际上是对 posix 模块的封装。

2.1、subprocess 模块

顺道再看看 subprocess 调用的实现:

if shell: #制作 shell 的参数
    args = ["/bin/sh", "-c"] + args
    if executable:
        args[0] = executable

if executable is None:
    executable = args[0]
# ··· ···
self.pid = os.fork() #创建子进程
# ··· ···
os.execvp(executable, args) #执行 shell 命令

3、posix 模块

posix 即 Portable Operating System Interface(可移植操作系统接口),是类 Unix 系统的兼容标准。

同样通过 help(posix) 看下是否有源文件,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVF4365W-1603002971090)(https://upload-images.jianshu.io/upload_images/13705657-bdc86b0996e50a78?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

可以看到 posix 是 built-in module,代表是直接编译好放在 python 这个可执行文件里的。

可以在 module 的 config.c 中找到相关的转接代码。

extern void initposix(void);
struct _inittab _PyImport_Inittab[] = {
    {"posix", initposix},
    // ...

3.1、对 built-in 模块的继续查找

实际上对于 built-in 模块还能继续查找,首先要弄清楚当前 python 的虚拟机是用什么实现的:

image

可以看到 macos 系统 python 虚拟机是 CPython 实现的。

CPython 是开源的,那么我们可以从 cpython 中找到相关的源码:

static PyMethodDef posix_methods[] = {
... ...
#ifdef HAVE_SYSTEM
    {"system",          posix_system, METH_VARARGS, posix_system__doc__},
#endif
... ...
};

#ifdef HAVE_SYSTEM
PyDoc_STRVAR(posix_system__doc__,
"system(command) -> exit_status\n\n\
Execute the command (a string) in a subshell.");
// 在Python中操作的任何元素都是一個由C語言實現的PyObject對象
static PyObject *
posix_system(PyObject *self, PyObject *args)
{
    char *command;
    long sts;
    if (!PyArg_ParseTuple(args, "s:system", &command))
        return NULL;
    Py_BEGIN_ALLOW_THREADS // 允许其他线程获取 GIL 锁来跑
    sts = system(command); // system call(或其他不会操作Python Data的调用)
    Py_END_ALLOW_THREADS // 重新获取 GIL 锁
    return PyInt_FromLong(sts);
}
#endif

可以看到 posix.system 最终会调用 C 的 system 函数。

C 的 system 函数就不需要再深入进去了,在 C/C++ 网站有很多介绍。

4、结论

macos 系统下:

os.system -> posix.system -> C 的 system 函数

python os.system("cd") 最近写了个脚本,阔以一键创建目录,并且下载代码。 这里用到了python的os模块。该模块可以操作系统命令,并且适配windows和Linux。os.system(‘mkdir hello’) 则可以创建一个hello的文件夹。 但是当程序运行到: os.system(‘cd hello’) 时候,虽然执行了该条命令,但是当前系统并没有切换到hello的目录下。我试着在python的命令行 阅读详情

相关推荐

python的os模块详细解读

os是“operating system”的缩写,os模块提供各种 Python 程序与操作系统进行交互的接口,使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性

景天科技苑 1万+

Python中os.system()、subprocess.run()、call()、check_output()的用法

text: 当设置为 True 时,stdin、stdout、stderr 会以“文本”模式打开(返回值对象中的 stdout、stderr 存储文本内容),否则返回值对象中 stdout、stderr 存储的是字节序列。注意:这个方法的返回值是命令的退出码,而不是一个对象,所以无法像 subprocess.run() 一样捕获命令输出内容(不要设置 stdout=PIPE 或 stderr=PIPE,否则可能造成命令卡死)。当它为 False 时,args 需是一个列表(并且不支持管道、重定向操作)

Python热爱者的博客 6735

Python os.system执行多条语句,os.system的返回值以及与os.popen的区别

OS模块:Operating System 操作系统模块 以下内容转自 https://blog.csdn.net/fengqingting2/article/details/41940149 https://blog.csdn.net/windone0109/article/details/8895875 https://blog.csdn.net/zgl07/article/det...

易天海 2180

Python中os.system的使用

在Unix上,返回值是进程的退出状态,在Windows上,返回值是系统 shell 程序在运行命令后返回的值。它是字符串类型,告诉执行哪个命令。“空格、()、\、”的转义都比较坑。

lsf1192354203的博客 3185

Deepracer 智能无人车-绿洲科学云平台介绍

Deepracer 智能无人车 绿洲科学云

woaixiyue19831的博客 1946

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

摇骰子、抽奖转盘酒桌游戏 人生重启模拟器小程序源码分享-开通流量主躺着赚钱

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1650

python 之os.system函数

python

qfturauyls的博客 1万+

Open3D 球旋转算法(BPA)三维建模【2026最新版】

球旋转算法,博客长期更新,本文最新更新时间为:2026年4月11日。

点云侠的博客 37万+

python os模块system_python 中 os.system 的本质 | 编程知识2

python 中 os 模块用得比较多,但 os.system 实际上是怎么调用 shell 命令的呢?简单来探寻一下。1、系统环境macos 10.15.6 x86_64python 3.8.5为什么要强调系统环境,因为 python 在不同系统版本上实现可能会有差异,待会讲解就能发现了。2、os 模块通过 help(os) 可以找到源文件查看,下面截取相关代码来看(直接用注释解释了)...

weixin_39624705的博客 372

【服务器电源架构与关键技术发展趋势】深度解析架构、方案、玩家与未来趋势

技术维度:台达 / 光宝在高功率密度(97%+ 效率)和垂直整合上领先,大陆厂商(麦格米特 / 欧陆通)在成本控制和快速响应上更优,国际厂商(英飞凌)聚焦核心器件突破。 客户维度:台达绑定英伟达核心供应链,麦格米特 / 欧陆通兼顾国内外客户,光宝 / 中恒电气侧重云端与互联网厂商。 趋势适配:所有厂商均加速布局 800V 高压架构、液冷技术和高功率 Power Shelf,以应对 AI 服务器单柜功率从 10kW→200kW 的升级需求。

昔时扬尘处 723

【数据集总结】不透水面积ISA:GAIA、CLUD-Urban、GISA

【数据集总结】不透水面积ISA:GAIA、CLUD-Urban、GISA

WW、forever的博客 2158

c调用system curl_python 中 os.system 的本质 | 编程知识2

python 中 os 模块用得比较多,但 os.system 实际上是怎么调用 shell 命令的呢?简单来探寻一下。1、系统环境macos 10.15.6 x86_64 python 3.8.5为什么要强调系统环境,因为 python 在不同系统版本上实现可能会有差异,待会讲解就能发现了。2、os 模块通过 help(os) 可以找到源文件查看, 下面截取相关代码来看(直接用注...

weixin_39575502的博客 213

华为OD机试 - 荒岛求生 - 栈Stack(Python/JS/C/C++ 新系统 100分)

每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 2838

python按行读取文件取消空白行_Python 将以空格分隔的文件行读取为单独的行

这是在Windows Server 2008 R2 上 . 我有一个输入文件 , 每行一个输入 . 一些输入中有空格 . 我正在尝试使用下面的简单代码 , 但是它将每个单词而不是每一行分开 . 我应该以 208 个新文件夹结束 ( 删除所有空格 ) , 但由于这个原因我最终以 230 个文件夹结束 . 我需要更改什么才能纠正问题?import osf = open ( "out.txt", "r"...

weixin_39653766的博客 173

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1158

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

本文将介绍如何使用VS2022克隆下载《植物大战僵尸C++自制版本》。Gitee项目地址:Gitee仓库地址Github项目地址:Github仓库地址游戏官网地址(下载可直接运行)游戏官网。

尔灵尔亿的博客 4940

【python】os.system() & os.popen() 在 python 执行 cmd 指令

而是一个16位的数,它的高位才是返回码。使用os.system返回值是脚本的退出状态码,该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码。os.system()返回值为256,十六位二进制数示为:00000001,00000000,高八位转成十进制为 1 对应 linux命令返回值 1。通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。一般来说,返回 0 表示运行成功。

学渣的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python中os.system、os.popen、subprocess.popen的区别

最近项目中需要在python中执行shell脚本,以下解释使用os.system、 os.popen和subprocess.popen的区别:1.os.system该函数返回命令执行结果的返回值,system()函数在执行过程中进行了以下三步操作: 1.fork一个子进程; 2.在子进程中调用exec函数去执行命令; 3.在父进程中调用wait(阻塞)去等待子进程结束。 对于fork失败,

啥也不是 6万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python os.system()和os.popen()

python os.system()和os.popen()

快递小可的博客 4万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python库之OS库

OS库是Python标准库,包含几百个函数。提供通用的、基本的操作系统交互功能 一、路径操作(os.path) 通常用import os.path或import os.path as op导入 常用函数 函数 描述 os.path.abspath(path) 返回path在当前系统中的绝对路径 os.path.normpath(path) 归一化path的表示形式(统一...

邱邱邱的博客 6394

python中os.system()的返回值

python中的os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系

渡江客涂鸦板 3万+

python os system用法_python基础之使用os.system来执行系统命令

今天我们来尝试使用python 的os.system来执行系统命令可以使用如下方法:import osprint os.system('ping www.baidu.com')输出的结果是:64 bytes from 223.26.58.21: icmp_seq=0 ttl=245 time=36.798 ms64 bytes from 223.26.58.21: icmp_seq=1 ttl=2...

weixin_39678531的博客 1153

Python模块_os.system()

OS模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下: 参考地址: https://www.runoob.com/python/os-file-methods.html <1、-------------------------------------------------------------------------------------------> dir(os) 会得到os里面所有的方法。 print(dir(os)) <2、--------------------

lkr 2万+

python os.popen和os.system的区别

转自:https://www.cnblogs.com/xhyan/p/8383814.html Python中os.system和os.popen区别 Python调用Shell,有两种方法:os.system(cmd)或os.popen(cmd)脚本执行过程中的输出内容。实际使用时视需求情况而选择。 两者的区别是: os.system(cmd)的返回值是脚本的退出状态码,只会有...

yournevermore的博客 1716

python-执行cmd指令(os.system和os.popen)

转载自:悠悠博客园 os.system 1.如果想在cmd执行python脚本,可以直接用如下指令 python [xx.py绝对路径] 比如我写了个hello.py的脚本,在脚本里面写入内容:print(“hello world!”),放到d盘目录路径为:d:\hello.py 2.os.system用来执行cmd指令,在cmd输出的内容会直接在控制台输出,返回结果为0表示执行...

ezreal_tao的博客 2万+
上一篇: python 执行 shell 命令卡死
下一篇: 量子比特的构造
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值