【问题标题】:Python: Referencing another projectPython:引用另一个项目
【发布时间】:2009-09-25 08:34:30
【问题描述】:

我希望能够从命令行运行我的 Python 项目。我正在引用其他项目,所以我需要能够在其他文件夹中运行模块。

完成这项工作的一种方法是修改 Pythonpath 环境变量,但我认为这是一种滥用。另一个技巧是将我想要的所有文件复制到一个目录中,然后运行 ​​Python。有没有更好的方法来做到这一点?

注意:我实际上是在 Eclipse 中编程,但我希望能够远程运行该程序。

类似问题:

【问题讨论】:

    标签: python command-line


    【解决方案1】:

    如果你导入 sys,它包含 PYTHONPATH 中的目录列表作为 sys.path

    将目录添加到此列表 (sys.path.append("my/path")) 允许您照常从当前模块中的这些位置导入,而无需更改系统上的全局设置。

    【讨论】:

    • 这是一个非常好的解决方案(对我有用),尽管我只是好奇是否有一种“正确”的方式来做到这一点。就像我希望有一个命令行选项
    • 据我所知,这“正确”的方式。我很好奇它有什么问题?
    • 没有错。我只是希望有一个命令行选项。
    • 如果需要,您可以将其作为脚本的命令行选项来实现:(非核心)argparse 模块非常适合从命令行选项中获取列表,然后您可以使用这些列表来扩展 sys.路径
    • 命令行选项是修改PYTHONPATH。可以这么说,这可能是也可能不是滥用,这取决于您这样做的原因。如果你想避免在全局 python 中安装你的库,改变它并不是滥用。
    【解决方案2】:

    看看类似的工具

    1. virtualenv,设置一个虚拟 python,您可以在其中安装您的模块,而无需全局获取它们。 http://pypi.python.org/pypi/virtualenv

    2. Setuptools,它允许您为您的模块指定(并自动安装)依赖项。 http://pypi.python.org/pypi/setuptools(如果您在使用 setuptools 时遇到问题,请查看 Distribute,一个维护的分支。http://pypi.python.org/pypi/distribute

    3. Buildout,它允许您部署完整的应用程序环境,包括第三方软件,例如 MySQL 或其他任何软件。 http://pypi.python.org/pypi/zc.buildout/

    【讨论】:

      【解决方案3】:

      首先,我确保我要包含的模块尚未全局安装。然后我在包含的目录中添加一个符号链接:

      # With pwd == module to which I want to add functionality.
      ln -s /path/to/some_other_module_to_include .
      

      然后我可以进行标准导入。这允许多个版本等。它不需要更改任何全局设置,如果您在不同的机器上工作,则不需要更改程序代码(只需更改符号链接)。

      【讨论】:

      • 令人恼火的是,符号链接在 Windows 中也没有那么灵活。
      • 同样,这是一个可行的解决方案,但有点骇人听闻。每个项目都有很多模块,所以这意味着要创建大量的 simlink。我不确定,但我相信它可能无法与 SVN 很好地交互
      • 您不应该将符号链接存储在 SVN 中。如果您有多个模块,我想您可以使用层次结构import parent.submodule,并且仅使用符号链接parent
      • 不幸的是,这与 Eclipse 处理导入其他项目的方式不一致
      【解决方案4】:

      如果您所说的“运行模块”是指导入它们,您可能会对我刚才问的this 问题感兴趣。

      【讨论】:

        【解决方案5】:

        我刚刚意识到我之前实际上已经解决了这个问题。这是我使用的方法 - 比 mavnn 复杂得多,但我也在解决从 Python 3.0 运行 Python2.x 程序的问题

        import os
        import subprocess
        env=os.environ.copy()
        env['PYTHONPATH']=my_libraries
        kwargs={"stdin":subprocess.PIPE, "env":env}
        subprocess.Popen(["python","-u",program_path],**kwargs)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-14
          • 2021-06-14
          • 2019-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          相关资源
          最近更新 更多