仅当从命令行执行脚本时,共享对象上的导入失败并出现 ModuleNotFound

Import on shared object fails with ModuleNotFound only when script is executed from command line

运行 变成了一个奇怪的问题,只有当我从命令行 运行 脚本时才会出现共享对象导入错误。如果我 运行 python 控制台中的脚本使用 exec(...)

它会成功

我有一个 class 需要共享对象:foo.py:

import os
cur_dir = os.curdir()
os.chdir('/tmp/dir_with_shared_object/')
import shared_object_class
os.chdir(cur_dir)

class Useful:
    ... # use the shared object import

然后有这样一个脚本:

from foo import Useful

如果我输入 python 控制台和 运行:

exec(open('script.py').read())

一切正常。

如果我 运行 在命令行上这样做:

python script.py

我会得到

ModuleNotFoundError: No module named 'shared_object_class'

与python相同。它是 3.7.3,GCC 7.3.0 Anaconda。任何人都知道是什么导致了共享对象导入行为的这种差异?

从自定义目录导入的标准方法是将其包含在 PYTHONPATH 环境变量中,使用 export PYTHONPATH=/tmp/dir_with_shared_object/.

更新 也可以使用

动态完成
import sys
p = '/tmp/dir_with_shared_object/'
sys.path.insert(0, p)

PS

我想我有一个解释为什么 OP 的原始代码不起作用。根据 this python reference page,导入系统尤其会在“包含输入脚本的目录(或未指定文件时的当前目录)”中进行搜索。因此 REPL 循环中的行为与 运行 脚本时的行为不同。显然,每次遇到导入语句时都会评估当前目录,而包含输入脚本的目录不会更改。