前言
旁边的实习生很苦恼的说,这个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模块详解
- 输入和输出
系统模块提供变量,以便更好地控制输入或输出。我们甚至可以将输入和输出重定向到其他设备。这可以使用三个变量来完成:
-
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)
结果:
-
退出程序
sys.exit([arg])可用于退出程序。可选参数arg可以是给定出口的整数或其他类型的对象。如果是整数,则零被视为“成功终止”。字符串也可以传递给sys.exit()方法。
示例:
# sys.exit()示例 import sys age = 17 if age < 18: # exits the program sys.exit("年了小于 18") else: print("年了不小于 18")
结果:
-
使用模块
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)>}
-
引用计数
sys.getrefcount()方法用于获取任何给定对象的引用计数。Python使用该值,因为当该值变为0时,该特定值的内存将被删除。
示例:import sys a = 'sys' print(sys.getrefcount(a))
结果:
后记
上面详细列举了sys常用的方法,还有一些方法如下:
方法 | 描述 |
---|---|
sys.setrecursionlimit() | 方法用于将Python解释器堆栈的最大深度设置为所需的限制。 |
sys.getrecursionlimit() method | sys.getrecursionlimit()方法用于查找解释器的当前递归极限或查找Python解释器堆栈的最大深度。 |
sys.settrace() | 它用于实现调试器、评测器和覆盖工具。这是特定于线程的,必须使用threading.settrace()注册跟踪。在更高级别上,sys.setrace()将回溯注册到Python解释器 |
sys.setswitchinterval() method | sys.setswitchinterval()方法用于设置解释器的线程切换间隔(以秒为单位)。 |
sys.maxsize() | 它获取Py_ssize_t数据类型的变量可以存储的最大值。 |
sys.maxint | maxint/INT_MAX表示可以由整数表示的最高值。 |
sys.getdefaultencoding() method | sys.getdefaultencoding()方法用于获取Unicode实现使用的当前默认字符串编码。 |