sys包

本文深入解析Python的sys模块,涵盖sys.argv、sys.platform、sys.exit等关键函数的使用方法及应用场景,适合Python开发者掌握核心系统操作技巧。

首先,我们利用import语句 输入 sys模块。基本上,这句语句告诉Python,我们想要使用这个模块。sys模块包含了与Python解释器和它的环境有关的函数。

当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能够被你 使用 。注意,初始化过程仅在我们 第一次 输入模块的时候进行。另外,“sys”是“system”的缩写。


Sys模块函数之多,我只能选取自己认为比较实用的一些函数列在此处。借马云找员工的说法,”找最合适的而不是最天才的”,这句话,我个人觉得在很多方面都能适应,学习也不在话下。Sys模块功能的确很多,但我们应该将重点放在那些功能才是最适合我们的,为此,我列的这些函数,就是我认为比较适合我以后开发的函数。

(1)sys.argv
很多人会想,我如何给我的程序在外部传递参数呢?这个,就可以实现。如:
Tesy.py

Import sys
Print sys.argv[number]

一般情况下,number为0是这个脚本的名字,1,2…则为命令行下传递的参数.如:
Test.py脚本内容:

import sys
 
print sys.argv[0]
print sys.argv[1]
print sys.argv[2]
print sys.argv[3]


那么

[root@databak scripts]# python test.py arg1 arg2 arg3
test.py
arg1
arg2
arg3


看到,对应的关系了吗?
sys模块中的argv变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的argv变量冲突。另外,它也清晰地表明了这个名称是sys模块的一部分。

sys.argv变量是一个字符串的 列表 (列表会在后面的章节详细解释)。特别地,sys.argv包含了 命令行参数 的列表,即使用命令行传递给你的程序的参数。

这里,当我们执行python using_sys.py we are arguments的时候,我们使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序。Python为我们把它存储在sys.argv变量中。

记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,'using_sys.py'是sys.argv[0]、'we'是sys.argv[1]、'are'是sys.argv[2]以及'arguments'是sys.argv[3]。注意,Python从0开始计数,而非从1开始。


(2)sys.platform
大家都知道,当今的程序比较流行的是跨平台。简单的说就是这段程序既可以在windows下,换到linux下也可以不加修改的运行起来,听起来就不错。所以,这个函数就可以派上用场了。
假设,我们想实现一个清除终端,linux下用clear, windows下用cls

Ostype=sys.platform()
If ostype==”linux” or ostype==”linux2”:
  Cmd=”clear”
Else:
  Cmd=”cls”

(3) sys.exit(n)
执行至主程序的末尾时,解释器会自动退出. 但是如果需要中途退出程序, 你可以调用sys.exit 函数, 它带有一个可选的整数参数返回给调用它的程序. 这意味着你可以在主程序中捕获对sys.exit 的调用。(注:0是正常退出,其他为不正常,可抛异常事件供捕获!)
sys.exit从python程序中退出,将会产生一个systemExit异常,可以为此做些清除除理的工作。这个可选参数默认正常退出状态是0,以数值为参数的范围为:0-127。其他的数值为非正常退出,还有另一种类型,在这里展现的是strings对象类型。

(4)sys.path
大家对模块都有一定了解吧?大家在使用模块的某一个功能前,是不是需要导入呢?答案是需要。那import,__import__命令就不用提干嘛的了吧。那大家在执行import module_name的时候,python内部发生了什么呢?简单的说,就是搜索module_name。根据sys.path的路径来搜索module.name
>>> sys.path
['', '/usr/local/lib/python24.zip', '/usr/local/lib/python2.4', '/usr/local/lib/python2.4/plat-freebsd4', '/usr/local/lib/python2.4/lib-tk', '/usr/local/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages']
大家以后写好的模块就可以放到上面的某一个目录下,便可以正确搜索到了。当然大家也可以添加自己的模块路径。Sys.path.append(“mine module path”).

sys.path包含输入模块的目录名列表。我们可以观察到sys.path的第一个字符串是空的——这个空的字符串表示当前目录也是sys.path的一部分,这与PYTHONPATH环境变量是相同的。这意味着你可以直接输入位于当前目录的模块。否则,你得把你的模块放在sys.path所列的目录之一。首先,我们利用import语句 输入 sys模块。基本上,这句语句告诉Python,我们想要使用这个模块。sys模块包含了与Python解释器和它的环境有关的函数。

(5)sys.modules
This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks.
Python.org手册里已经说的很明白了。
For names in sys.modules.keys():
If names != ’sys’:
    ……
(6)sys.stdin,sys.stdout,sys.stderr
stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们


当Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能够被你 使用 。注意,初始化过程仅在我们 第一次 输入模块的时候进行。另外,“sys”是“system”的缩写。

sys模块中的argv变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的argv变量冲突。另外,它也清晰地表明了这个名称是sys模块的一部分。


sys.argv变量是一个字符串的 列表 (列表会在后面的章节详细解释)。特别地,sys.argv包含了 命令行参数 的列表,即使用命令行传递给你的程序的参数。


如果你使用IDE编写运行这些程序,请在菜单里寻找一个指定程序的命令行参数的方法。


这里,当我们执行python using_sys.py we are arguments的时候,我们使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序。Python为我们把它存储在sys.argv变量中。


记住,脚本的名称总是sys.argv列表的第一个参数。所以,在这里,'using_sys.py'是sys.argv[0]、'we'是sys.argv[1]、'are'是sys.argv[2]以及'arguments'是sys.argv[3]。注意,Python从0开始计数,而非从1开始。


sys.path包含输入模块的目录名列表。我们可以观察到sys.path的第一个字符串是空的——这个空的字符串表示当前目录也是sys.path的一部分,这与PYTHONPATH环境变量是相同的。这意味着你可以直接输入位于当前目录的模块。否则,你得把你的模块放在sys.path所列的目录之一。

原文:https://blog.youkuaiyun.com/u013203733/article/details/72540075 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>根据用户当前查询和对话历史,用户需要解决C++中sys报错的解决方案 但注意:用户提供的引用内容是关于系统DLL文件路径的问题,可能与系统文件缺失或路径配置有关,但用户明确提到“C++ sys报错”,因此需要结合C++开发环境来分析 首先,用户提到的“sys”在C++中通常不是标准库的一部分。在C++中,系统相关的操作可能涉及系统头文件(如Windows.h)或系统库(如kernel32.lib)。常见的报错可能括: 1. 头文件找不到(如#include <sys/types.h>) 2. 链接时找不到系统库 3. 运行时动态链接库(DLL)缺失 根据引用[1]中提到的内容,用户可能遇到了DLL缺失的问题,特别是系统目录(System32和SysWOW64)下的DLL文件。但是,在C++开发中,报错可能发生在编译期、链接期或运行期。 因此,我们需要分情况讨论: 情况1:编译时报错(如找不到头文件) - 检查头文件路径:确保含的sys相关头文件存在。例如,在Windows中,通常使用<windows.h>,而<sys/types.h>是POSIX标准,在Windows下可能由MinGW或Cygwin提供。 - 解决方案:确认开发环境(如使用MinGW则安装相应的头文件,或检查项目含路径) 情况2:链接时报错(如无法解析的外部符号) - 可能缺少系统库。例如,某些系统函数需要链接特定的库(如kernel32.lib, user32.lib等) - 解决方案:在链接器选项中添加相应的库 情况3:运行时报错(如缺少DLL) - 这通常是程序运行时找不到动态链接库(DLL)。引用[1]中提到的情况:64位系统下,程序可能从System32或SysWOW64目录加载DLL。如果程序是32位的,它应该使用SysWOW64目录下的DLL(但注意,System32存放64位DLL,SysWOW64存放32位DLL,这是Windows的一个设计)。如果程序在运行时报告缺少DLL,需要将对应的DLL放到程序目录或系统目录。 - 解决方案:将缺失的DLL复制到程序目录或系统目录(注意区分32位和64位) 但是,用户没有提供具体的报错信息,因此需要给出通用的排查步骤。 另外,用户提到“参考站内引用”,但引用内容主要是关于系统目录下DLL缺失的情况。我们可以参考这一点,重点解决运行时DLL缺失的问题。 步骤总结: 1. 确认报错发生的阶段(编译、链接、运行) 2. 根据报错信息查找解决方案 - 编译报错:检查头文件含路径和开发环境配置 - 链接报错:添加需要链接的库 - 运行报错:确保程序所需的DLL可用(放在程序目录或系统目录) 3. 注意系统位数(32位/64位)匹配问题 特别针对引用[1]中提到的DLL问题: - 如果报错信息中提到了具体的DLL(如splitter.sys, secdrv.sys等),则需要将这些DLL放置到正确的位置。 - 注意:System32存放64位DLL,SysWOW64存放32位DLL。如果程序是32位,而缺失的DLL在SysWOW64目录下存在,则通常不需要复制到System32(因为32位程序会重定向到SysWOW64)。但是,引用[1]提到一种特殊情况:SysWOW64下有而System32下没有,此时需要复制到System32?这可能是由于某些程序错误地尝试从System32加载32位DLL(而实际上应该重定向),所以复制一份32位DLL到System32可能是一种临时解决方案(但不符合系统规范,可能造成混乱)。建议优先将DLL放在程序所在目录。 因此,对于运行时报错,更推荐的做法是将缺失的DLL放在程序的可执行文件同一目录下。 由于用户问题比较宽泛,我们提供通用解决方案,并建议用户提供具体报错信息以获得更准确的帮助。 生成相关问题以引导用户提供更多信息。 注意:在回答中引用站内引用时,在引用内容末尾添加[^1] </think> ### C++ "sys"相关报错的解决方案 在C++开发中,"sys"相关报错通常涉及系统文件、路径配置或依赖库问题。根据引用的提示,以下是分步骤解决方案: 1. **区分报错类型** - **编译时报错**:通常由头文件缺失引起 ```cpp #include <sys/types.h> // Linux/Unix系统头文件 #include <windows.h> // Windows系统头文件 ``` 若报错`cannot open source file "sys/xxx.h"`: ✅ 解决方案: - **Linux/macOS**:安装开发 `sudo apt-get install build-essential` - **Windows**: - 检查Visual Studio是否安装"C++桌面开发"组件 - MinGW用户需安装`mingw-w64-x86_64-headers` - **链接时报错**:通常由库文件缺失引起 ✅ 解决方案: - 添加库路径:`g++ main.cpp -L/path/to/libs -l<库名>` - Windows需确保`.lib`文件在`VC\lib`目录 2. **运行时DLL缺失问题**(引用核心问题) 当报错"找不到xxx.sys/.dll"时: ✅ 解决方案: - **关键操作**: ```powershell # 检查SysWOW64(32位)和System32(64位)目录 dir C:\Windows\System32\*.dll | findstr "protect" dir C:\Windows\SysWOW64\*.dll | findstr "protect" ``` - 若仅`SysWOW64`存在DLL(如`PROTECT.DLL`)而`System32`缺失: ⚠️ **按引用特别提示**:需将64位DLL复制到`System32`目录 ```powershell copy C:\Windows\SysWOW64\PROTECT.DLL C:\Windows\System32\ ``` - 推荐方案:将DLL放在可执行文件同级目录 3. **系统驱动级报错**(如`.sys`文件) 涉及`splitter.sys`, `secdrv.sys`等: ✅ 解决方案: - 更新硬件驱动(特别是网络/存储设备) - 运行系统文件检查: ```cmd sfc /scannow ``` - 检查杀毒软件是否误删系统文件 4. **环境配置验证** - **PATH检查**:确保编译器和库路径正确 ```cmd :: Windows示例 set PATH=%PATH%;C:\MinGW\bin;C:\Program Files\LLVM\bin ``` - **项目配置**(CMake示例): ```cmake include_directories(/usr/include/sys) # 显式添加路径 link_directories(/usr/local/lib) ``` > **重要提示**: > 复制系统文件前请创建备份!若报错涉及内核驱动(`.sys`),建议优先通过Windows Update或设备制造商更新驱动。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值