从远程目录导入Python模块

从远程目录导入Python模块,python,Python,从远程相对目录导入模块的最短方法是什么 我们一直在使用这段代码,这并不太糟糕,只是您当前的工作目录必须与此代码的目录相同,或者相对路径中断,这可能容易出错,并且会让用户感到困惑 import sys sys.path.append('../../../Path/To/Shared/Code') 这段代码(我认为)修复了这个问题,但要键入的代码要多得多 import os,sys sys.path.append(os.path.realpath(os.path.join(os.path.dirn

从远程相对目录导入模块的最短方法是什么

我们一直在使用这段代码,这并不太糟糕,只是您当前的工作目录必须与此代码的目录相同,或者相对路径中断,这可能容易出错,并且会让用户感到困惑

import sys
sys.path.append('../../../Path/To/Shared/Code')
这段代码(我认为)修复了这个问题,但要键入的代码要多得多

import os,sys
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '../../../Path/To/Shared/Code')))
是否有较短的方法附加绝对路径?简洁性很重要,因为这必须在我们的许多文件中键入/显示。(我们无法将其考虑在内,因为这样它就会出现在共享代码中,我们无法找到它。鸡和蛋、自举等等)

另外,我们一直盲目地附加到sys.path,这让我很不安,但这将是更多的代码。我真希望标准库中的一些东西能对此有所帮助

这通常会出现在从命令行运行的脚本文件中。我们正在运行Python 2.6.2

编辑:
我们使用相对路径的原因是,我们的计算机上通常有多个独立的代码库副本。代码库的每个副本都使用自己的共享代码副本,这一点很重要。因此,任何只支持单一代码库的解决方案(例如,“将其放在站点包中”)对我们都不起作用


有什么建议吗?谢谢大家!

您有什么理由不想在站点包下创建自己的共享代码目录吗?然后您可以只导入import shared.code.module…

您有几种处理导入的方法,所有这些都在Python语言手册中有说明

看到和

  • 将它放在站点包中,并有多个Python安装。您可以使用普通的
    PATH
    环境变量选择安装

  • 将目录放入
    PYTHONPATH
    环境变量中。这是个人设置,因此您可以通过这种方式管理代码库的多个版本

  • 将目录放入站点包中的
    .pth
    文件中。您可以使用普通的
    PATH
    环境变量选择安装


  • 您已经在一条评论中解释了为什么不想安装“单一站点软件包目录”,但如何将
    站点软件包
    放入一个小型模块,比如
    jebootstrap.py

    import os, sys
    
    def relative_dir(apath):
      return os.path.realpath(
          os.path.join(os.path.dirname(apath),
          '../../../Path/To/Shared/Code'))
    
    def addpack(apath):
      relative = relative_dir(apath)
      if relative not in sys.path:
        sys.path.append(relative)
    
    现在,代码中的任何地方都可以

    import jebootstrap
    jebootsrap.addpack(__file__)
    

    每次安装时,共享代码库的所有其余部分都可以保持独立。

    因为您不想在站点包中安装它,所以应该使用或创建独立的开发环境。这就解决了问题,意味着您不必再摆弄sys.path(事实上,Buildout正是为您这么做的)。

    我们不喜欢网站包,因为我们的计算机上通常有多个独立的代码库副本。我们希望代码的每个副本都使用其共享代码的副本(因此是相对路径)。如果机器上有多个代码库副本(包括共享代码),我认为所有这些解决方案都会崩溃。(和我对Crad评论的问题一样。)我编辑了我的问题来解释这一点。@Jon Eric:如果你使用
    PYTHONPATH
    ,每个人都有自己对所选版本的代码库的私人引用。是每人安装一次,还是每人安装几次?我觉得有很多副本,不一定有很多人。@Lennart,你说得对。一个用户通常拥有代码库的多个副本。但这并不能消除工作目录必须是特定目录的要求,尽管。。。虽然这似乎不是什么大问题。但我不得不说,这种情况对我来说简直是一个可怕的构建/虚拟。@Lennart,我有一个愚蠢的打字错误,没有使用
    relative\u dir
    中的
    apath
    参数——现在就修复了它,您将看到,不要求工作目录是任何特定的内容--
    \uuuuu文件\uuuuuuu
    传递到
    addpack
    的是调用模块所在的位置,与当前工作目录无关。当然,像
    virtualenv
    这样的高级方法也是可能的,但如果我正确地理解了这个问题,那么这与开发无关,与多个断开连接的部署(在同一台非开发机器上)有关。我必须说,我认为使用virtualenv比这简单得多,所以哪种高级是一个品味问题,我想是吧我看不出有任何理由不使用virtualenv或buildout进行部署。相反,构建的目的是部署。“代码库的多个独立副本”在我看来确实像是virtualenv(或构建)的一个用例。virtualenv广泛用于多种部署。