【问题标题】:Command python: different meanings in command line and batch script命令python:命令行和批处理脚本中的不同含义
【发布时间】:2016-09-24 02:06:57
【问题描述】:

我已经使用Python3 安装了 Anaconda。然后,我另外创建了一个带有Python2 的虚拟环境。计算机上没有其他 Python。我的问题:

如果我运行命令

python C:\Path\To\myScript.py arg1 arg2

在 CMD 中,Python 3.4 用于执行myScript.py(如预期/期望的那样)。但!如果我创建一个精确包含上层命令的.bat 文件,则使用 Python 2.7。 (我用myScript.py中的命令print(sys.version)检查版本)。

我该如何解决这个问题?

【问题讨论】:

  • 检查你的路径变量
  • ...;C:\Anaconda3;C:\Anaconda3\Scripts;... 是仅有的两个与 Python 相关的部分。在C:\Anaconda3 中,有python.exe 启动Python3。在C:\Anaconda3\Scripts 中没有python.exe
  • 尝试将路径变量附加到您的 python 安装文件夹的路径中。然后再试一次
  • @HassanMehmood 我以为C:\Anaconda3 是我的python 安装文件夹。

标签: python python-2.7 python-3.x batch-file command-line


【解决方案1】:

尝试在批处理脚本中指定 Python3 可执行文件的完整路径(即 /path/to/Python3 )。它可能默认为系统python。

如果您使用的是 virtualenv,并且您可能应该使用,则在 venv/bin/python(或 Windows 下的类似文件)中有一个单独的 python 可执行文件 - 通过绝对路径使用这个特定的可执行文件通常是确保正在使用正确的 Python 环境,尤其是当脚本自动运行或由其他用户运行时。这完全是设计使然,virtualenv 经常这样使用。

【讨论】:

  • 这可行(并且是目前唯一的解决方案),但不能以 clean 的方式回答问题:)
  • 我不确定您对“干净”使用什么标准,但我认为这是一个典型的解决方案,适用于需要使用 virtualenv 的 init.d 脚本,并在在 linux 系统上启动。如果你有额外的反馈,关于什么会使它更干净,我可能会提供更多的东西。我也可以说,至少在 posix 系统上,更改系统使用的 python 从来没有是一个好主意。
  • 嗯,解决这个问题的一个干净方法是 i) 找到解释,为什么同一个命令可能意味着两个不同的东西,并且 ii) 可能消除原因的问题。 (即,与其服用止痛药并将我的头撞到墙上,我宁愿发现 i)将头撞到墙上会导致疼痛,并且 ii)停止将我的头撞到墙上)。
  • 我知道您在 Windows 上,但在 Posix 上,“为什么”是运行它的用户不同。该用户有不同的环境,因此python3 是模棱两可的。批处理文件由系统运行,因此假定为系统 python。你想要不同的行为,所以你需要指定你想要的行为。通过指示完整路径。在给定的盒子上可能有很多不同的 python3 可执行文件 - 但每个文件夹中只有一个。
  • 我给了你一个可行的解决方案。我会谦虚地建议,这个答案会导致原因,不是症状,接受它会减少你对止痛药的依赖,同时让你停止敲打你的头。如果我是你,我会在我的工作批处理脚本上点击save,在这个 SO 答案上点击answer,并在我解决“为什么?”的同时愉快地喝啤酒。对于我选择的平台。
【解决方案2】:

您可以通过更改路径变量的值来更改python的默认版本,这可以通过遵循此答案How to update PATH variable permanently from cmd? Windows来完成

或者您可以暂时更改要使用的版本,请按照此How to run different python versions in cmd

希望我的回答对你有帮助。

【讨论】:

  • 恐怕不是(见我在问题下的评论):/
【解决方案3】:

由于您使用的是 Anaconda,因此在 python 命令之前添加一行 source deactivate 会显式停用任何 virtualenv

编辑:对于 windows cmd 提示符,它可能只是 deactivate

【讨论】:

  • 这没有帮助:.bat 中的deactivate 可能会导致错误(窗口消失,而source deactivate 对以下python ... 命令没有影响。
  • 奇怪,它并没有为我关闭 cmd。现在的快速修复是指定完整路径
  • source deactivate 导致错误:确切地说,源未被识别为内部或外部命令。我想现在指定整个路径确实是最好的。
猜你喜欢
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2015-10-11
相关资源
最近更新 更多