首页 > 代码库 > 命令行执行python模块时提示包找不到的问题

命令行执行python模块时提示包找不到的问题

庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具。

多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可以运行任意一个python脚本,而使用命令行运行却不行?命令行下(或者双击执行)总是提示“ImportError: No module named xxx”?pydev究竟做了什么魔术呢?



长话短说,以上面工程为例,如果是在命令行中直接执行 python c.py , 都会提示"ImportError: No module named xx_package.b".但是pydev中可以直接运行。

比较两者的包查找路径,也就是sys.path,

pythondev:

[‘F:\\Archive\\workspace-java\\PyExperiment\\xx_package‘, ‘F:\\Archive\\workspace-java\\PyExperiment‘, ‘F:\\Archive\\workspace-java\\PyExperiment\\xx_folder‘ ,。。。]

命令行:

[‘F:\\Archive\\workspace-java\\PyExperiment\\xx_package‘, 。。。]


什么都不用说了,明眼人一看就明白了,pydev在运行时会把当前工程的所有文件夹路径都作为包的搜索路径,而命令行默认只是搜索当前路径。也于是乎,xx_package也就不可能会被找到,因为它是在上一级目录中。


明白了这一点,剩下的就很简单了,要在命令行中执行c.py, 或者修改sys.path, 将上一级目录也包含进去,不过个人不喜欢。

比较简单的方式还是统一脚本的执行路径是工程的根目录,即每次都在工程根目录下新建一个脚本,比如叫main.py。它什么也不做,只是将c.py导入进来。仅此而已。

main.py

import xx_package.c

试试,这样就可以正常在命令行中运行了,当然双击脚本也是也一样的



另外,补充两点,

1. 与shell等脚本不同, python的搜索路径,是第一个执行的脚本所在的路径,而不是当前命令行窗口中提示的路径

 PyExperiment \ xx_package >python c.py

  PyExperiment > pthon xx_package/c.py

  对python来说,搜索路径都是c.py所在的路径PyExperiment \ xx_package

2. 如果某个文件夹是纯粹的文件夹,不是python意义上的包。如上面实例工程中的xx_folder, 那么可以直接在命令行中运行c.py. 因为导入b.py时不需要指出查找xx_folder, 具体可以参看久远前的一篇文章

python最简单直接的自定义模块导入方法