庄稼人不是专职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, 具体可以参看久远前的一篇文章