Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将代码从开发计算机移动到目标计算机时管理Python路径_Python_Path_Pythonpath - Fatal编程技术网

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

在将代码从开发计算机移动到目标计算机时管理Python路径,python,path,pythonpath,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)计算机。

我有一个具有此目录结构和以下文件的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\u根目录。但是当我回显$PYTHPATH时,/home/project_root确实会出现

我做错了什么

(我不想依赖.bashrc文件为目标机器设置PYTHONPATH——代码是为Django应用程序编写的,最终将由www data运行。我知道Django的apache配置包含PYTHONPATH规范,但我不想在这里使用它,因为我首先要确保代码通过在目标机器环境中进行单元测试。)

好奇者和好奇者 这似乎是一个用户ID和权限问题。 -当由普通用户的命令启动时,解释器可以按预期导入模块。 -当由sudo启动时(我在这里运行Ubuntu),解释器无法按预期导入模块。 -我一直在用sudo调用测试脚本,因为这些文件归www-data所有(b/c它们将由作为Django应用程序一部分运行apache的用户调用)。 -将文件的所有权更改为普通用户的所有权后,测试脚本运行时不会出现导入错误(尽管会导入到各种与用户ID相关的墙中)


很抱歉浪费您的时间。这个问题应该结束。尝试在脚本中显式设置python路径。如果您不想更改它,您可以始终在tester中的路径中添加类似“./”的内容。也就是说:

sys.path.append("../")

在导入设置之前将其粘贴到测试仪脚本中。配置

import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path
是python解释器在导入python模块时查找的所有目录的列表。 这会将包含安装模块的父目录添加到该列表的开头,这意味着将首先检查本地目录。如果您在系统范围内安装了模块,这一点很重要。有关此内容的详细信息,请参见此处:

编辑:您还可以在
/usr/local/lib/python2.X/site packages/
中放置一个.pth文件。pth文件只是一个文本文件,python解释器将在其中搜索每一行。因此,只需添加一个包含这一行的文件:

/home/project_root /主页/项目根目录 (我不想依赖.bashrc文件为目标机器设置PYTHONPATH——代码是为Django应用程序编写的,最终将由www data运行。我知道Django的apache配置包含PYTHONPATH的规范,但我不想在这里使用它,因为我首先要确保代码通过我的验证。)ts目标机器环境中的单元测试。)

如果代码是针对Django应用程序的,那么您不在Django项目的上下文中测试它有什么原因吗?在Django项目的上下文中测试它会带来一些好处:

  • Django的
    manage.py
    将为您设置Python环境。它将向
    sys.path
    添加适当的项目路径,并正确设置环境变量
    Django\u SETTINGS\u模块
  • Django的库包括大量的单元测试工具,您可以轻松地扩展该功能以包括您自己的测试工具。在Django项目中执行测试就像通过
    manage.py执行单个命令一样简单

  • 我想到了这一点,但这需要在许多脚本中添加行。每当一个文件相对于根目录移动时,这些行就会中断。好的,但是如果我的单元测试分布在许多文件上呢?我需要将其添加到所有文件中,或者设置一个python文件来运行它们。(我确实有一个“全部运行”命令)脚本,但现在它在bash中,当然这很容易更改。)用.pth文件将目录添加到python路径是最终的答案。我必须找出.pth文件的一些Ubuntu怪癖才能工作(答案建议的目录对我的计算机不起作用——请参见问题1369947,python pth文件不起作用)。答案很好,但给出的代码有几个问题:1)dirname需要os.path前缀(除非我们假设它是直接导入的?),2)结尾缺少“')。可能还希望添加os和sys的导入语句,使其更加清晰。所讨论的代码不是Django特定的。它是一种库,可以被更多特定于Django的代码调用,但它的编写目的是为浏览器调用Django之外的其他图形界面提供服务。因此,我没有想到在Django环境中进行测试,也没有想到如何进行测试。请使用Django单元测试命令。然后,您将在靠近部署环境的环境中进行测试。使用su作为www-data:sudo-su www-data my-test.py运行。将目录作为该用户放入python路径时遇到问题——我记得,启动bash并设置PYTHONPATH变量不起作用(可能与linux用户帐户配置有关)。这是我发布关于使用.pth文件的另一个问题的原因之一。