繁体   English   中英

从远端目录导入Python模块

[英]Importing Python modules from a distant directory

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

我们一直在使用此代码,除了您当前的工作目录必须与此代码所在的目录相同或相对路径中断之外,这还算不错,这可能容易出错并且会使用户感到困惑。

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。

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

有什么建议么? 谢谢!

由于您不想将其安装在站点程序包中,因此应使用buildoutvirtualenv创建隔离的开发环境。 这就解决了问题,并且意味着您不必再摆弄sys.path(事实上,因为Buildout确实为您完成了此工作)。

您已经在评论中解释了为什么您不想安装“单个site-packages目录”,但是将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__)

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM