【问题标题】:Best way to execute a python script in a given conda environment在给定的 conda 环境中执行 python 脚本的最佳方法
【发布时间】:2017-06-20 21:06:30
【问题描述】:

我想使用 subprocess 包从另一个 python 脚本 trigger.py 执行 python 脚本 executed.pyexecuted.py 必须在与 trigger.py 不同的 conda 环境中运行(比如说 executed_envtrigger_env)。最好的方法是什么?我当前的trigger.py 代码是:

command = "python executed.py --option1 -dir /path/to/dir"
args = shlex.split(command)
my_subprocess = subprocess.Popen(args)

由于executed.pytrigger_env 环境中运行,因此返回错误。

【问题讨论】:

    标签: python subprocess environment conda


    【解决方案1】:

    如果您只需要使用其他 python,那么我相信您只需要在 command 中使用指向其他 python 的完整路径。

    尝试进入您的executed_env(即,如果是Linux,则为source activate executed_env)并执行which python。让我们假设返回 HOME/.conda/envs/executed_env/bin/python 现在它变成了您在命令中使用的 python - 即 command = "HOME/.conda/envs/executed_env/bin/python executed.py --option1 -dir /path/to/dir"。这个

    例如,让我们在不同的 python 版本中运行executed.py

    • 创建你的py27环境conda create -n py27 python=2.7这是trigger_env
    • 创建您的 py35 环境 conda create -n py35 python=3.5 这是 executed_env
    • 通过运行source activate py35which python 获取到py35 的完整python 路径(我们称它为EXECUTED_PYTHON 来进行描述)。通过source deactivate停用。
    • 然后我们创建executed.py

      import sys
      print(sys.version)
      
    • 然后是trigger.py(包括参数,但它们什么也没做)

      command = "EXECUTED_PYTHON executed.py --option1 -dir /path/to/dir"
      args = shlex.split(command)
      my_subprocess = subprocess.Popen(args)
      
    • 现在让我们在trigger_env -- source activate py27python trigger.py 中运行它。

    • 这将打印3.5.2 |Continuum Analytics, Inc. [...](3.5 是重要部分)。你可以看到它正在使用executed_env中的另一个python。

    【讨论】:

    • 我在写问题时想到了这一点。对于部署来说,它不是很舒服......
    【解决方案2】:

    我对任何 conda 内置方法进行了一些研究,并发现了以下内容。第一个是解决方法,第二个是最终解决方案内置解决方案(在撰写本文时不可用)。

    1. conda 包装器。 Guilherme Melo 在 conda 环境中为 python 可执行文件创建了一个包装器。如果您在 IDE 中将其设置为 python 解释器,例如PyCharm,它将激活调用它的 conda 环境,然后调用 python 解释器。 在“创建 conda 包装器”部分下查看此处: https://pypi.org/project/exec-wrappers/

    2. conda 运行。 在a standard and fast way to execute a command inside an environment 上的 conda github 页面上进行了长时间的讨论,导致了一个新命令的实现(实际上是一个重新调用,因为它以前可用): conda run

    它在issue #7320 中进行了描述,并有望在 2018 年 10 月在conda-4.6 中发布!

    【讨论】:

    • 只是补充一下,因为我一直在弄乱语法:conda run -n envname python -c "print('Hello!')"
    【解决方案3】:

    在 windows 环境中使用 conda,我只是复制了 conda 的方式,用于从不同的环境中启动不同的 jupyter notebook。所有快捷方式都使用“C:\ProgramData\Anaconda3\python.exe”调用“C:\ProgramData\Anaconda3\cwp.py”脚本,然后通过附加参数,您可以选择要执行的环境和文件。

    在我的例子中,环境名称 = AutomateXXReporting,要执行的文件 = C:\Users\ismael.serrano\Documents\GIT\xxx\notebooks\exports\get_JIRA_user_streams.py

    C:\ProgramData\Anaconda3\python.exe C:\ProgramData\Anaconda3\cwp.py C:\Users\ismael.serrano\.conda\envs\AutomateXXReporting C:\Users\ismael.serrano\.conda\envs\AutomateXXReporting\python.exe C:\Users\ismael.serrano\Documents\GIT\xxx\notebooks\exports\get_JIRA_user_streams.py
    

    以前我按照保罗的指示成功地进行了,但遇到了一个不够充分的情况。完整路径中的 python 无法找到一些库,使用 cwp.py 它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 2020-08-11
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多