代码之家  ›  专栏  ›  技术社区  ›  Jon-Eric

从远程目录导入python模块

  •  2
  • Jon-Eric  · 技术社区  · 15 年前

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

    我们一直在使用这段代码,除了您当前的工作目录以外,这段代码还不错 与此代码的目录或相对路径中断相同,这对用户来说容易出错并容易混淆。

    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。

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

    有什么建议吗?谢谢您!

    4 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

    你已经在一条评论中解释了为什么你不想安装“一个站点包目录”,但是放进去怎么样? site-packages 单一的,微小的 模块 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__)
    

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

        2
  •  4
  •   Lennart Regebro    15 年前

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

        3
  •  1
  •   Gavin M. Roy    15 年前

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

        4
  •  -1
  •   S.Lott    15 年前

    您有几种方法来处理导入,这些方法都记录在Python语言手册中。

    http://docs.python.org/library/site.html http://docs.python.org/reference/simple_stmts.html#the-import-statement

    1. 把它放在站点包中,并有多个python安装。您可以使用普通 PATH 环境变量。

    2. 把目录放在你的 PYTHONPATH 环境变量。这是每个人的设置,因此您可以通过这种方式管理多个版本的代码库。

    3. 把目录放进去 .pth 网站包中的文件。您可以使用普通 路径 环境变量。