Python36 \ Scripts在错误的python版本上启动

时间:2019-07-05 13:44:26

标签: python python-3.x package pypy

所以我制作了一个包,其中包含一个python文件,该文件在安装过程中进入Python36 \ Scripts。但是在WinOS上,我有3个全局python解释器。

主要是python2.7,第二个是python3.6,第三个是python3.7。

“ my_package”软件包安装在python3.6中的C:\ Python36 \ Lib \ site-packages \ my_package中,并且包含python文件settings.py

脚本``my_script.py''也安装在python3.6下的C:\ Python36 \ Scripts \ my_script.py

因此,现在您知道在哪里写我cmd my_script.py时会有问题了,它将在python2.7上运行,因为它对python2.7不友好,将引发异常。

在UNIX中,使用shebang行即可轻松解决。 如何使用python3.6解释器调用my_script.py。

在您回答之前,我确实尝试过此操作:

  • cmd处于管理员模式

  • py -3.6 my_script.py启动将导致[Errno 2]没有此类文件或目录

包装的结构:

  1. my_package
    1. my_package
      • __ init_.py
      • settings.py
    2. 脚本
      • __ init_.py
      • my_script.py
    3. setup.py

setup.py

from setuptools import setup

with open("README.md", "r") as fh:
    long_description = fh.read()

setup(name='my_package',
      version='0.1.4',
      description='Work in progress',
      long_description=long_description,
      long_description_content_type="text/markdown",
      author=',
      author_email='',
      packages=['my_package'],
      zip_safe=False,
      install_requires=['SQLAlchemy', 'pandas'],
      scripts=['scripts/my_script.py']
      )

my_script.py

from distutils.sysconfig import get_python_lib
sys.stdout.write(get_python_lib())
sys.path.insert(0, get_python_lib())

from my_package.settings import *

2 个答案:

答案 0 :(得分:1)

在调用python script.py时,操作系统找到了文件script.py,因此您必须提供script.py的完整路径,即{{1 }}。

如果希望 python 查找脚本,则应调用python c:\python36\scripts\script.py(不带python -m script),它将启动python并在.py中查找一个名为sys.path的模块。您可以不带前面的script来呼叫script.py,但这更加复杂:

  • 打开python文件时,必须在Windows中注册正确的python解释器作为exe才能使用,并且一次只能注册一个解释器。
  • 目录*.py必须在您的路径上

Windows不使用c:\python36\scripts shebang“ protocol”,在该协议中,您将用于执行文件的命令放在文件的第一行中

答案 1 :(得分:0)

我针对此问题做出了解决方法,它将很好地工作。现在不再有一个脚本,而是拥有my_script.py和my_scriptV3.py ...,现在my_scriptV3.py具有my_script.py拥有的所有代码,而my_script.py现在是版本处理程序,可帮助用户正确设置要升级的版本仅在主python解释器为python 2的情况下使用并要求执行一次操作,并且稍后每次从cmd调用my_script.py时,它将使用以前的信息并调用my_scriptV3.py,而无需再次执行任何其他步骤。

以下代码可能会对某人有所帮助(未优化):

class Bus:
    def __init__(self):
        self.passengers = set()