Python 是一种解释性、交互式、面向对象的编程语言。在 shell 上可以通过 python 命令方便的运行 .py文件。但是,如果不能正确选择参数,将导致程序运行失败或出错。如,因为依赖引用问题。本篇介绍在命令行运行 python 的常用方法。

直接运行

直接运行 python 文件,大多数情况下,这种方法可以正常运行,假设 python 文件完整路径为 /pythonprojects/run.py

1
2
cd /pythonprojects
python run.py

run.py 中依赖的模块在 python 环境变量中,或者 /pythonprojects 目录下,这种方法运行没有问题。其实,在运行时,python 会把 /pythonprojects 添加到 PYTHONPATH 中第一个。

添加参数运行

当开发的程序项目比较大,或者出现类似如下结构时,需要增加参数才能正常运行.

例子来源于:https://github.com/huanglianghua/siamfc-pytorch,假设克隆到 /pythonprojects 下:

1
2
cd  /pythonprojects
git clone https://github.com/huanglianghua/siamfc-pytorch.git

项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
siamfc
---- __init__.py
---- backbones.py
---- datasets.py
---- heads.py
---- losses.py
---- ops.py
---- siamfc.py
---- transforms.py
tools
---- demo.py
---- test.py
---- train.py

因为 train.py 中引用了 siamfc 中的模块,因此,直接使用如下方法是运行不成功的。

1
2
cd /pythonprojects/siamfc-pytorch
python tools/train.py

提示找不到模块: ModuleNotFoundError: No module named 'siamfc'. 这是因为虽然你进入了目录 /pythonprojects/siamfc-pytorch,但是,运行代码 python tools/train.py 时,却将 /pythonprojects/siamfc-pytorch/tools 作为当前运行目录。

此时,需要使用如下方法运行

1
2
cd /pythonprojects/siamfc-pytorch
python -m tools.train

使用命令 man python 可以查看 -m 参数的含义:

1
2
-m module-name
Searches sys.path for the named module and runs the corresponding .py file as a script.

使用 python -m tools.train 运行,会把 /pythonprojects/siamfc-pytorch 当作主目录,以子模块调用的方式运行 train.py 模块

添加环境变量

对于例子: siamfc,也可以通过如下方法运行:

1
2
3
4
cd /pythonprojects/siamfc-pytorch
# 必须使用大写
export PYTHONPATH=$PWD:$PYTHONPATH
python tools/train.py

此时,通过命令查看 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 时需要增加:

  1. SiamMask
  2. SiamMask/experiments/siammask_sharp
    PYTHONPATH 中,这是因为 SiamMask/tools/demo.py 中会之间调用 SiamMask/experiments/siammask_sharp 中的 custom.py 模块:from custom import Custom. 即项目默认把 SiamMaskSiamMask/experiments/siammask_sharp 都考虑在环境变量中。
1
2
3
4
5
cd SiamMask
export PYTHONPATH=$PWD:$PYTHONPATH
cd SiamMask/experiments/siammask_sharp
export PYTHONPATH=$PWD:$PYTHONPATH
python ../../tools/demo.py --resume SiamMask_DAVIS.pth --config config_davis.json

PYTHONPATH 变量的值是一个字符串,其中包含 Python 应添加到 sys.path 目录列表中的目录列表。PYTHONPATH 的主要用途是当我们开发一些我们希望能够从 Python 导入但我们尚未制作成可安装 Python 包的代码时。

jupyter 中调用自己开发的模块

那如果我喜欢在 jupyterlab 中开发,想要调用上面的 siamfcSiamMask 时,我们可以这样:

1
2
3
4
5
import sys
sys.path.append("/workspace/projects/siamfc/")
# or
sys.path.insert(0, "/workspace/projects/SiamMask/")
sys.path.insert(0, "/workspace/projects/SiamMask/experiments/siammask_sharp")

此时,就可以直接在 jupyterlab 中直接调用

1
from models import siammask

参考文献

  1. [python]自问自答:python -m参数?
  2. Module Not Found Error when trying to run from cmd