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

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

多年来。一直困惑于这样一个问题:相同的project。相同的代码,使用pydev能够执行随意一个python脚本,而使用命令行执行却不行?命令行下(或者双击执行)总是提示“ImportError: No module named xxx”?pydev到底做了什么魔术呢?


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

长话短说,以上面project为例,假设是在命令行中直接执行 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在执行时会把当前project的全部文件夹路径都作为包的搜索路径,而命令行默认仅仅是搜索当前路径。也于是乎。xx_package也就不可能会被找到。由于它是在上一级文件夹中。


明确了这一点,剩下的就非常easy了,要在命令行中运行c.py, 或者改动sys.path, 将上一级文件夹也包括进去。只是个人不喜欢。

比較简单的方式还是统一脚本的运行路径是project的根文件夹,即每次都在project根文件夹下新建一个脚本,比方叫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意义上的包。如上面实例project中的xx_folder, 

那么能够直接在命令行中执行c.py. 由于导入b.py时不须要指出查找xx_folder, 详细能够參看久远前的一篇文章

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