仅当从命令行执行脚本时,共享对象上的导入失败并出现 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 循环中的行为与 运行 脚本时的行为不同。显然,每次遇到导入语句时都会评估当前目录,而包含输入脚本的目录不会更改。
运行 变成了一个奇怪的问题,只有当我从命令行 运行 脚本时才会出现共享对象导入错误。如果我 运行 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 循环中的行为与 运行 脚本时的行为不同。显然,每次遇到导入语句时都会评估当前目录,而包含输入脚本的目录不会更改。