我有一个带有这个目录结构的python项目和这些文件:
/home/project_root
|---__init__.py
|---setup
|---__init__.py
|---configs.py
|---test_code
|---__init__.py
|---tester.py
测试器脚本从setup / configs.py导入,引用“setup.configs”。它在我的开发机器上运行良好。
这适用于开发(Linux)计算机。当我将它移动到另一台(Linux)计算机时,我用
设置了PYTHONPATHPYTHONPATH = "/home/project_root"
但是当我运行tester.py时,它找不到configs模块。当我运行交互式Python解释器时,sys.path不包含/ home / project_root目录。但是当我回显$ PYTHPATH时,/ home / project_root会出现。
我在这里做错了什么?
(我不想依赖.bashrc文件为目标机器设置PYTHONPATH - 代码用于Django应用程序,最终将由www-data运行。而且,我知道Django的apache配置包含PYTHONPATH的规范,但我不想在这里使用它,因为我首先尝试确保代码在目标机器环境中通过其单元测试。)
好奇和好奇 这似乎是一个用户ID和权限问题。 - 当由普通用户的命令启动时,解释器可以按预期导入模块。 - 当由sudo启动时(我在这里运行Ubuntu),解释器无法按预期导入模块。 - 我一直用sudo调用测试脚本,因为这些文件归www-data所有(b / c它们将由运行apache的用户调用,作为Django应用程序的一部分)。 - 将文件的所有权更改为普通用户的所有权后,测试脚本 运行时没有导入错误(尽管是进入各种与用户ID相关的墙)。
抱歉浪费你的时间。 应该关闭此问题。
答案 0 :(得分:4)
将其粘贴在import setup.configs
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path
是导入python模块时python解释器查找的所有目录的列表。
这会将包含安装模块的父目录添加到该列表的开头,这意味着将首先检查本地目录。如果您在系统范围内安装了模块,这一点很重要。有关详细信息,请访问:sys doc。
编辑:您还可以在/usr/local/lib/python2.X/site-packages/
中放置一个.pth文件.pth文件只是一个文本文件,在python解释器将搜索的每一行上都有一个目录路径。所以只需在其中添加一行文件:
/home/project_root
答案 1 :(得分:0)
尝试在脚本中明确设置python路径 。如果您不想更改它,您可以随时在测试仪的路径中添加类似“../”的内容。也就是说:
sys.path.append("../")
答案 2 :(得分:0)
(我不想依赖.bashrc文件为目标机器设置PYTHONPATH - 代码用于Django应用程序,最终将由www-data运行。而且,我知道Django的apache配置包含PYTHONPATH的规范,但我不想在这里使用它,因为我首先尝试确保代码在目标机器环境中通过其单元测试。)
如果代码是用于Django应用程序的,那么您是否有理由不在Django项目的上下文中对其进行测试?在Django项目的上下文中测试它会带来一些好处:
manage.py
将为您设置Python环境。它会将适当的项目路径添加到sys.path
,并且它会正确设置环境变量DJANGO_SETTINGS_MODULE
。manage.py
执行单个命令一样简单。