从远程目录导入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语言手册中有说明 看到和
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广泛用于多种部署。