Python本地模块

8

我有几个项目目录,希望能拥有特定于它们的库/模块。例如,我的目录结构可能像这样:

myproject/
  mymodules/
    __init__.py
    myfunctions.py
  myreports/
    mycode.py

假设在 myfunctions.py 中有一个名为 add 的函数,我可以使用最简单的方法从 mycode.py 中调用它:
execfile('../mymodules/myfunctions.py')
add(1,2)

但更为复杂的是,我还可以进行以下操作。
import sys
sys.path.append('../mymodules')
import myfunctions

myfunctions.add(1,2)

这是最符合习惯的方法吗?还有一些提到修改PYTHONPATH(os.environ['PYTHONPATH']?),但是我需要注意其他事项吗?

此外,我曾看到import语句包含在类语句中,在其他情况下,定义在包含类定义的Python文件的顶部。是否有正确/首选的方法来做到这一点?


2
通过您的更复杂的方法,您正在修改PYTHONPATH,因此,在我看来,这是最好的方法。 - Lelouch Lamperouge
mycode.py 直接移动到 myproject 中。 - Ruggero Turra
@Eknath Iyer,你说得对...我不确定是不是更喜欢直接增加PYTHONPATH变量目录(这在技术上与在sys.path中定义的搜索路径不同?)。就像os.environ[PYTHONPATH] += ':../mymodules'或其他什么东西。 - hatmatrix
@wiso —— 是的,这样做很有道理,但我的项目非常庞大,有许多其他(嵌套)子目录,它们都需要调用“mymodules”。 - hatmatrix
1个回答

17

除非有非常好的理由,否则不要动用execfilesys.path.append。相反,只需将代码组织成适当的Python包,并像任何其他库一样进行导入。

如果你的mymodules实际上是一个大项目的一部分,那么请按以下方式设置你的包:

myproject/
    __init__.py
    mymodules/
        __init__.py
        myfunctions.py
    myreports/
        __init__.py
        myreportscode.py

然后你可以像这样在代码中的任何地方导入mymodules:

from myproject.mymodules import myfunctions
myfunctions.add(1, 2)
如果你的 mymodules 代码被许多单独且不同的项目使用,那么将其制作成一个独立的包,并安装到需要使用它的任何环境中。

谢谢 - 但我只想通过我的项目来访问它,并且希望它是可移植的,这样我只需将“myproject”移动到另一台计算机上即可复制它。 myreports / 只需要调用 mymodules / 中的功能,而不是反过来,因此出于这些原因,我不希望制作系统范围的软件包。 - hatmatrix
我的建议可以使你的“myproject”变得可移植,而不需要除标准软件包设置之外的任何东西。 - Mark Gemmill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接