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

3 投票
3 回答
3634 浏览
提问于 2025-04-15 14:01

我有一个Python项目,目录结构和文件如下:

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

测试脚本通过“setup.configs”来导入setup/configs.py文件。在我的开发机器上运行得很好。

这个在开发的Linux电脑上没问题。但是当我把它移到另一台Linux电脑上时,我设置了PYTHONPATH:

PYTHONPATH = "/home/project_root"

但是当我运行tester.py时,它找不到configs模块。而当我运行交互式的Python解释器时,sys.path里没有包含/home/project_root这个目录。不过,当我用echo $PYTHONPATH命令查看时,/home/project_root确实出现了。

我到底哪里做错了呢?

(我不想依赖.bashrc文件来为目标机器设置PYTHONPATH——这段代码是为Django应用写的,最终会由www-data用户运行。而且,我知道Django的apache配置里包含了PYTHONPATH的设置,但我不想在这里使用,因为我首先想确保代码在目标机器环境下能通过单元测试。)

越来越奇怪了 这似乎是一个用户ID和权限的问题。 - 当普通用户发起命令时,解释器可以正常导入模块。 - 当用sudo启动时(我在用Ubuntu),解释器就无法正常导入模块。 - 我一直是用sudo来调用测试脚本,因为这些文件是www-data用户拥有的(因为它们会被运行apache的用户调用,作为Django应用的一部分)。 - 在把文件的拥有权改为普通用户后,测试脚本确实可以运行,没有导入错误(不过,遇到了各种与用户ID相关的问题)。

抱歉浪费了你的时间。这个问题应该关闭。

3 个回答

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运行一个命令就可以了。
0

试着在你的脚本里明确设置一下 Python 的路径。如果你不想每次都去改这个路径,你可以在测试器里加上类似 "../" 的东西。也就是说:

sys.path.append("../")
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 解释器在导入模块时会查找的所有目录。把包含 setup 模块的父目录添加到这个列表的最前面,意味着 Python 会优先检查本地目录。这一点很重要,特别是当你的模块是全局安装的时候。想了解更多,可以查看这里:sys 文档

编辑:你也可以在 /usr/local/lib/python2.X/site-packages/ 目录下放一个 .pth 文件。这个 .pth 文件其实就是一个文本文件,每一行写一个目录路径,Python 解释器会在这些路径中查找。所以只需要创建一个文件,里面写上这一行:

/home/project_root

撰写回答