Python制作包时遇到的常见问题

  之前因为工作关系需要做一个包,让一些项目可以调用这个包,在做这个包的时候遇到了一些问题,这些里面网上不好找的我在这做个整理:

    一、在开发工具上能够正常运行但是在命令行执行时报错

      这个问题在网上可以找到但是看的时候未必能理解所以在这里写一下,假如你的包里有两层目录,那么第一层目录就被叫做根,第二层被叫做子包,当遇到这个问题时,是因为运行的工具不同,开发工具能够找到子包,在开发工具的环境变量中它有这个路径(开发工具会自动添加),所以这样做出来的东西你在开发工具上执行是不会有任何问题的,但是在命令行执行时,就会有问题,命令行没有开发工具强大,就算你用命令行去编写这个包他也不会自动把这个路径添加到环境变量,他只能找到根的那一层,所以为了让在命令行也能执行这个包,就需要在包里的python各个文件中将搜索目录指定为根的同一层,比如子包文件中加了sys.path.append("..")这句,意思就是我要引用上一层,在第一层的文件中加入sys.path.append(".")这句,意思是我要引用自身所在这一层。那现在再来说说sys.path这个,当我们导入一个模块时:import  xxx,默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中,把路径添加到系统的环境变量,或把该路径的文件夹放进已经添加到系统环境变量的路径内(来自https://www.cnblogs.com/mandy-study/p/7735801.html),也就是我们将这个包的路径加到了环境变量中,而且之间有了引用,当其他项目引用这个包的时候就会正常调用,我是这样解决的,这样就可以在cmd的窗口执行了。(注:我会这么加是因为我不想外部项目调用我的子包,或许子包内可以不用加但为了保险起见,我是这样写的,或许在子包内加sys.path.append(".")这个外部也可以直接调用呢,这里就自己探究)

    二、在开发工具上能够正常运行但是在命令行执行时闪退

      这个问题曾经让我头疼了一下,在开发工具上做的东西拿到命令行总是闪退,导致我将做的东西一句一句在命令行测试这又改了一遍,这个问题很神奇,当你引用的东西找不到是会闪退,当你执行的语句太复杂好像也会闪退,曾经为了处理这个一度迷失,那开发工具做出来的东西在开发工具上运行一点问题都没有,但是在命令行就有问题,处理方法当导入是闪退基本就是找不到引用的文件导致的如果是自己写的包请关注一下上面的那个问题,下面说说一般的语句在执行时闪退,我遇见很多一言不合就闪退,但是最终都落到了一个函数上面,下面的说明也以这个为例说明:

subprocess.Popen(actionCommand,stdout=subprocess.PIPE,shell = True)

      这个函数的第一个参数可以是list也可以是字符串,当你用list传入的时候你在命令行执行的时候就会闪退,当你换乘字符串的时候就可以正常执行,在网上查了下说是用list传入这个函数也会自动转化成cmd能够执行的形式,所以我判断是在这个转化的过程中出现了状况导致了命令行的闪退,所以我就将代码全部使用了字符串来传,这样在命令行就可以正常执行了,当然在其他代码的地方也出现了闪退的情况,我都是一句句替换最后才有了能在命令行执行的东西,希望可以帮助到大家。

posted on 2020-11-25 11:16  1548562170  阅读(90)  评论(0编辑  收藏  举报