在命令行运行 python 程序的方法
Python 是一种解释性、交互式、面向对象的编程语言。在 shell 上可以通过 python 命令方便的运行 .py
文件。但是,如果不能正确选择参数,将导致程序运行失败或出错。如,因为依赖引用问题。本篇介绍在命令行运行 python 的常用方法。
直接运行
直接运行 python 文件,大多数情况下,这种方法可以正常运行,假设 python 文件完整路径为 /pythonprojects/run.py
1 | cd /pythonprojects |
当 run.py
中依赖的模块在 python 环境变量中,或者 /pythonprojects
目录下,这种方法运行没有问题。其实,在运行时,python 会把 /pythonprojects
添加到 PYTHONPATH 中第一个。
添加参数运行
当开发的程序项目比较大,或者出现类似如下结构时,需要增加参数才能正常运行.
例子来源于:https://github.com/huanglianghua/siamfc-pytorch
,假设克隆到 /pythonprojects
下:
1 | cd /pythonprojects |
项目结构如下:
1 | siamfc |
因为 train.py
中引用了 siamfc
中的模块,因此,直接使用如下方法是运行不成功的。
1 | cd /pythonprojects/siamfc-pytorch |
提示找不到模块: ModuleNotFoundError: No module named 'siamfc'.
这是因为虽然你进入了目录 /pythonprojects/siamfc-pytorch
,但是,运行代码 python tools/train.py
时,却将 /pythonprojects/siamfc-pytorch/tools
作为当前运行目录。
此时,需要使用如下方法运行
1 | cd /pythonprojects/siamfc-pytorch |
使用命令 man python
可以查看 -m
参数的含义:
1 | -m module-name |
使用 python -m tools.train
运行,会把 /pythonprojects/siamfc-pytorch
当作主目录,以子模块调用的方式运行 train.py
模块
添加环境变量
对于例子: siamfc,也可以通过如下方法运行:
1 | cd /pythonprojects/siamfc-pytorch |
此时,通过命令查看 python 当前运行时环境变量:
1 | python -c "import os;print(os.environ['PYTHONPATH'])" |
可以发现,已经把 /pythonprojects/siamfc-pytorch
增加到 python 运行时的环境变量。这样在 train.py
中调用 siamfc
模块时就可以正常调用。
建议:在创建 python 工程时,最后保持各模块主目录的一致性,如各模块导入时都以工程主目录为起点进行调用 import.
有时,有些项目是不同作者开发或其他原因,导致各模块之间 import
时采用的主目录不同。那么在命令行运行时,就需要把各个独立项目的目录都添加到 PYTHONPATH
中。如:https://github.com/foolwood/SiamMask.git
在运行如 demo.py
时需要增加:
- SiamMask
- SiamMask/experiments/siammask_sharp
到PYTHONPATH
中,这是因为SiamMask/tools/demo.py
中会之间调用SiamMask/experiments/siammask_sharp
中的custom.py
模块:from custom import Custom
. 即项目默认把SiamMask
和SiamMask/experiments/siammask_sharp
都考虑在环境变量中。
1 | cd SiamMask |
PYTHONPATH 变量的值是一个字符串,其中包含 Python 应添加到 sys.path 目录列表中的目录列表。PYTHONPATH 的主要用途是当我们开发一些我们希望能够从 Python 导入但我们尚未制作成可安装 Python 包的代码时。
jupyter 中调用自己开发的模块
那如果我喜欢在 jupyterlab 中开发,想要调用上面的 siamfc
或 SiamMask
时,我们可以这样:
1 | import sys |
此时,就可以直接在 jupyterlab 中直接调用
1 | from models import siammask |