将代码从开发计算机移动到目标时管理Python路径

时间:2009-09-02 17:45:17

标签: python path pythonpath

我有一个带有这个目录结构的python项目和这些文件:

/home/project_root
|---__init__.py
|---setup
       |---__init__.py
       |---configs.py
|---test_code
       |---__init__.py
       |---tester.py

测试器脚本从setup / configs.py导入,引用“setup.configs”。它在我的开发机器上运行良好。

这适用于开发(Linux)计算机。当我将它移动到另一台(Linux)计算机时,我用

设置了PYTHONPATH
PYTHONPATH = "/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相关的墙)。

抱歉浪费你的时间。 应该关闭此问题。

3 个答案:

答案 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项目的上下文中测试它会带来一些好处:

  1. Django的manage.py将为您设置Python环境。它会将适当的项目路径添加到sys.path,并且它会正确设置环境变量DJANGO_SETTINGS_MODULE
  2. Django的库包括充足的单元测试设施,您可以轻松扩展该功能以包含您自己的测试设施。在Django项目中执行测试就像通过manage.py执行单个命令一样简单。