Python sys模块详解

前言

旁边的实习生很苦恼的说,这个python在windows运行有bug啊,我写了个a.py需要依赖b.py中的方法,可我明明在a.py模块中写了:

from package2.test2.b import print_b

我在pycharm中可以运行,但是用cmd命令行就报错:

ModuleNotFoundError: No module named 'package2'

这是我项目的层级:
在这里插入图片描述
b.py模块的代码:

def print_b():
    print("bbbbb")

a.py模块的代码:

from pacakge2.test2.b import print_b
print_b()

我:这个与windows系统没关系,你放在任何系统你不告诉a.py模块在哪里找package2包,它都找不到。
实习生:啥意思啊?你就直接告诉我怎么解决这个bug吧。
我:用sys模块的path方法就能解决。
实习生:好,我搜一下,试试

a few moment later

实习生:没什么用,依然报上面的错。

from pacakge2.test2.b import print_b
import sys
sys.path.append("D:/project/pyspark_project/pacakge2")
print_b()

我:你犯了两个错误,第一你代码第一行就这几导入package2,这个时候解释器还没有把这个路径传入到系统路径中,依然无法识别;第二你这个路径是嵌套了多层,需要给系统路径中添加多个路径。

实习生:好了,搞定了

from pacakge2.test2.b import print_b
import sys
sys.path.append("D:/project/pyspark_project")
sys.path.append("D:/project/pyspark_project/pacakge2")
print_b()

在这里插入图片描述
我:你应该把sys模块进行全面学习

sys模块简介

Python中的sys模块提供了各种函数和变量,用于操作Python运行时环境的不同部分。它允许对解释器进行操作,因为它提供了对与解释器强交互的变量和函数的访问。让我们考虑下面的例子。

import sys

print(sys.version)

结果:

3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]

在上面的例子中,使用了sys.version,它返回一个字符串,其中包含Python解释器的版本以及一些附加信息。这显示了sys模块如何与解释器交互。让我们深入阅读这篇文章,以获得有关sys模块的更多信息。

sys模块详解

  1. 输入和输出
    系统模块提供变量,以便更好地控制输入或输出。我们甚至可以将输入和输出重定向到其他设备。这可以使用三个变量来完成:
  • stdin
    它可以用于直接从命令行获取输入。它用于标准输入。它在内部调用input()方法。它还自动在每个句子后面加上“\n”。
    示例:

    import sys
    
    for line in sys.stdin:
        if 'q' == line.rstrip():
            break
        print(f'Input : {line}')
    
    print("Exit")
    
    

    结果:
    在这里插入图片描述

  • stdout
    一个内置的文件对象,类似于Python中解释器的标准输出流。stdout用于直接向屏幕控制台显示输出。输出可以是任何形式,可以从print语句、表达式语句输出,甚至可以直接从提示输入输出。默认情况下,流处于文本模式。事实上,无论在代码中调用什么打印函数,都会先将其写入sys.stdout,然后再写入屏幕。
    示例:

    import sys
    
    sys.stdout.write('Hello sys')
    
    

    结果:
    在这里插入图片描述

  • stderr
    每当Python中发生异常时,都会将其写入sys.stderr。
    示例:

    import sys
    
    
    def print_to_stderr(*a):
        # Here a is the array holding the objects
        # passed as the argument of the function
        print(*a, file=sys.stderr)
    
    
    print_to_stderr("Hello sys")
    
    

    结果:
    在这里插入图片描述
    2. 命令行参数
    命令行参数是在程序调用期间与调用语句一起传递的参数。为了使用sys模块实现这一点,sys模块提供了一个名为sys.argv的变量

  • 它是一个命令行参数列表

  • len(sys.argv)提供了命令行参数的数量

  • sys.argv[0]是当前Python脚本的名称
    示例:

    # 命令行传递参数的示例
    
    import sys
    
    n = len(sys.argv)
    print("传递参数的数量", n)
    
    # Arguments passed
    print("\npython 脚本名称:", sys.argv[0])
    
    print("\n传递的参数为:", end=" ")
    for i in range(1, n):
        print(sys.argv[i], end=" ")
    
    # Addition of numbers
    Sum = 0
    
    for i in range(1, n):
        Sum += int(sys.argv[i])
    
    print("\n\n结果:", Sum)
    
    

    结果:
    在这里插入图片描述

  1. 退出程序
    sys.exit([arg])可用于退出程序。可选参数arg可以是给定出口的整数或其他类型的对象。如果是整数,则零被视为“成功终止”。

    字符串也可以传递给sys.exit()方法。

    示例:

    # sys.exit()示例
    
    
    import sys
    
    age = 17
    
    if age < 18:
    
        # exits the program
        sys.exit("年了小于 18")
    else:
        print("年了不小于 18")
    
    

    结果:
    在这里插入图片描述

  2. 使用模块
    sys.path是sys模块中的一个内置变量,它返回解释器将搜索所需模块的目录列表。
    在Python文件中导入模块时,解释器首先在其内置模块中搜索指定的模块。如果找不到,它会查看sys.path定义的目录列表。

    sys.path是一个普通列表,可以进行操作。

    示例1:列出所有的路径

    import sys
    
    
    print(sys.path)
    
    

    结果:

    ['D:\\project\\pyspark_project', 'D:\\project\\pyspark_project', 'D:\\develop\\python3.7\\python37.zip', 
    'D:\\develop\\python3.7\\DLLs', 'D:\\develop\\python3.7\\lib', 'D:\\develop\\python3.7', 'D:\\develop\\sparkenv', 
    'D:\\develop\\sparkenv\\lib\\site-packages', 'D:\\develop\\sparkenv\\lib\\site-packages\\win32', 
    'D:\\develop\\sparkenv\\lib\\site-packages\\win32\\lib', 'D:\\develop\\sparkenv\\lib\\site-packages\\Pythonwin']
    

    示例2:移除sys.path中的某些路径

    import sys
    
    # 移除系统中的所有路径
    sys.path = []
    
    # 移除后我们试着导一下包
    import pandas
    
    

    结果:
    在这里插入图片描述

    示例3:sys.modules返回当前shell已导入的Python模块的名称。

    import sys
    
    
    print(sys.modules)
    
    

    结果:

    {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_weakref': <module '_weakref' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'nt': <module 'nt' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'encodings': <module 'encodings' from 'D:\\develop\\python3.7\\lib\\encodings\\__init__.py'>, 'codecs': <module 'codecs' from 'D:\\develop\\python3.7\\lib\\codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from 'D:\\develop\\python3.7\\lib\\encodings\\aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'D:\\develop\\python3.7\\lib\\encodings\\utf_8.py'>, '_signal': <module '_signal' (built-in)>, '__main__': <module '__main__' from 'D:\\project\\pyspark_project\\a.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from 'D:\\develop\\python3.7\\lib\\encodings\\latin_1.py'>, 'io': <module 'io' from 'D:\\develop\\python3.7\\lib\\io.py'>, 'abc': <module 'abc' from 'D:\\develop\\python3.7\\lib\\abc.py'>, '_abc': <module '_abc' (built-in)>, 'site': <module 'site' from 'D:\\develop\\python3.7\\lib\\site.py'>, 'os': <module 'os' from 'D:\\develop\\python3.7\\lib\\os.py'>, 'stat': <module 'stat' from 'D:\\develop\\python3.7\\lib\\stat.py'>, '_stat': <module '_stat' (built-in)>, 'ntpath': <module 'ntpath' from 'D:\\develop\\python3.7\\lib\\ntpath.py'>, 'genericpath': <module 'genericpath' from 'D:\\develop\\python3.7\\lib\\genericpath.py'>, 'os.path': <module 'ntpath' from 'D:\\develop\\python3.7\\lib\\ntpath.py'>, '_collections_abc': <module '_collections_abc' from 'D:\\develop\\python3.7\\lib\\_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'D:\\develop\\python3.7\\lib\\_sitebuiltins.py'>, '_bootlocale': <module '_bootlocale' from 'D:\\develop\\python3.7\\lib\\_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.gbk': <module 'encodings.gbk' from 'D:\\develop\\python3.7\\lib\\encodings\\gbk.py'>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'pywin32_bootstrap': <module 'pywin32_bootstrap' from 'D:\\develop\\sparkenv\\lib\\site-packages\\win32\\lib\\pywin32_bootstrap.py'>, 'pywin32_system32': <module 'pywin32_system32' (namespace)>}
    
  3. 引用计数
    sys.getrefcount()方法用于获取任何给定对象的引用计数。Python使用该值,因为当该值变为0时,该特定值的内存将被删除。
    示例:

    import sys
    
    a = 'sys'
    
    print(sys.getrefcount(a))
    
    

    结果:
    在这里插入图片描述

后记

上面详细列举了sys常用的方法,还有一些方法如下:

方法描述
sys.setrecursionlimit()方法用于将Python解释器堆栈的最大深度设置为所需的限制。
sys.getrecursionlimit() methodsys.getrecursionlimit()方法用于查找解释器的当前递归极限或查找Python解释器堆栈的最大深度。
sys.settrace()它用于实现调试器、评测器和覆盖工具。这是特定于线程的,必须使用threading.settrace()注册跟踪。在更高级别上,sys.setrace()将回溯注册到Python解释器
sys.setswitchinterval() methodsys.setswitchinterval()方法用于设置解释器的线程切换间隔(以秒为单位)。
sys.maxsize()它获取Py_ssize_t数据类型的变量可以存储的最大值。
sys.maxintmaxint/INT_MAX表示可以由整数表示的最高值。
sys.getdefaultencoding() methodsys.getdefaultencoding()方法用于获取Unicode实现使用的当前默认字符串编码。

参考文献

Python sys Module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRivers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值