在Raspbian上同时运行多个python版本

On Raspbian run multiple python Versions simultaniously

我有一些以前的程序,在Python3.1出现的时候。在程序中,我经常使用Callable()传递一个函数,它的参数如下:

1
tvf.mi(datei_bu, text=datei_opt, command=Callable(exec_datei_opts, datei_opt))

现在我想再次使用我的程序,但是callable对象已经不见了。在Web中,我发现这个功能在Python3.2中被删除了,而其他的选择都不适合我。

最后我决定重新安装python 3.1。但是,我不知道是否可以同时安装多个python 3版本,或者当我想使用这个特殊版本时,如何为这个版本"创建"一个shell命令。

我的问题是:

  • 是否有替代被移除的callable物体?
  • 如何同时使用多个Python版本?
  • 如何创建匹配的shell命令?


Callable看起来很像functools.partial

这是部分工作。当我跑步的时候:

1
2
3
4
5
6
7
8
from functools import partial
from operator import mul

def do_stuff(num, command):
    return num + command()

for y in range(5):
    print(do_stuff(5, partial(mul, y, 2)))

我得到:

1
2
3
4
5
5
7
9
11
13

你应该能够做到:

1
2
from functools import partial
tvf.mi(datei_bu, text=datei_opt, command=partial(exec_datei_opts, datei_opt))

似乎Python从未内置过Callable。您可能把它与Callable谓词混淆了,后者确实被删除,然后又被带回来:

New in version 3.2: This function was first removed in Python 3.0 and then brought back in Python 3.2.

我在网上找到的所有关于Callable的参考资料都指向沼泽包(think python图书的副产品),其中swampy.Gui.Callable是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Callable(object):
   """Wrap a function and its arguments in a callable object.
    Callables can can be passed as a callback parameter and invoked later.
    This code is adapted from the Python Cookbook 9.1, page 302,
    with one change: if call is invoked with args and kwds, they
    are added to the args and kwds stored in the Callable.
   """

    def __init__(self, func, *args, **kwds):
        self.func = func
        self.args = args
        self.kwds = kwds

    def __call__(self, *args, **kwds):
        d = dict(self.kwds)
        d.update(kwds)
        return self.func(*self.args+args, **d)

    def __str__(self):
        return self.func.__name__

你也可以看看这个问题的答案,在这个问题上,OP想要为同样的目的重新实现Callable

安装python 3.1

如果您仍然想尝试安装旧版本的python 3,可以尝试以下操作。我假设Raspbian是基于Debian的发行版,并且应用了相同的命令。这是Dockerfile,它验证了您可以在debian-jessie-compatibe系统上执行此操作。您可以在shell中尝试来自它的RUN命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM debian:jessie

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install --no-install-recommends --yes software-properties-common && \
    add-apt-repository ppa:deadsnakes/ppa && \
    # The PPA is designed for Ubuntu, but the trick makes it work
    # because Debian Jessie is compatible with Ubuntu Trusty #
    # on package-level
    sed -i 's/jessie/trusty/g' \
        /etc/apt/sources.list.d/deadsnakes-ppa-jessie.list && \
    apt-get update && \
    apt-get install --no-install-recommends --yes python3.1

CMD python3.1


使用update-alternatives命令。它可以帮助您灵活地使用python。

这是示例代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ sudo update-alternatives --list python3
update-alternatives: error: no alternatives for python

$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.4 1
update-alternatives: using /usr/bin/python3.4 to provide /usr/bin/python3 (python3) in auto mode
$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 2
update-alternatives: using /usr/bin/python3.5 to provide /usr/bin/python3 (python3) in auto mode

$ sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   2         auto mode
  1            /usr/bin/python3.4   1         manual mode
  2            /usr/bin/python3.5   2         manual mode

Press enter to keep the current choice[*], or type selection number:

在终端中,给出安装python 3.1的路径,如下所示:

1
/<python3.1 folder>/bin/python  filename.py

或者,您可以尝试创建虚拟环境并激活它然后您可以运行给定的脚本以下是帮助链接:http://docs.python-guide.org/en/latest/dev/virtualenvs/


如果python 3.1不可用,就像在@joeiddon answer上的注释中看到的那样,您可能需要更改代码库。在这种情况下,您可以:

猴修补可调用与functools.partial

具有避免多次代码修改的优点。

1
2
3
from functools import partial
Command = partial
tvf.mi(datei_bu, text=datei_opt, command=Command(exec_datei_opts, datei_opt))

可选地:

用lambda替换callable()是可行的,但它承担了多个代码修改的负担。

1
tvf.mi(datei_bu, text=datei_opt, command=Callable(exec_datei_opts, datei_opt))

替换为:

1
tvf.mi(datei_bu, text=datei_opt, command=lambda x=datei_opt: exec_datei_opts(x))

terminal运行:

1
python3.1 your_program.py


最后我得到了我所有问题的答案。为了解决我所有的问题,我用了很多答案中的东西。他们来了:

1)是否有可调用对象的替换对象已丢失?

基本上没有。至少没有一个在这种情况下工作。我将解释为什么这不会影响我的解决方案。

我犯了一个错误,就是不看我的include依赖项就从我的tkinter应用程序中删除代码。萨吉的anwer让我重新考虑是否曾经使用过沼泽地,我确实这样做了。我甚至在我的书架上找到了与之相当的德语版本("Programmieren Lernen mit python")。愚蠢的我!X}

我在不同的文件中定义了我的GUI组件,并将它们导入到我的主应用程序main.py中。

我在编程方面不是很先进,所以我不知道,例如:

sub.py:(早在main.py之前就写了)

1
2
3
4
import THISISTHEFORGOTTENMODULE

def subfoo(temp=0):
    ... #some Code in which Functions from THISISTHEFORGOTTENMODULE were used

MY.PY:

1
2
3
4
5
import sub

subfoo()
temp = SuperSpecialFunctionFromForgottenModule()
subfoo(temp)

这个星座导致了我写main.py时不必说THISISTHEFORGOTTENMODULE.SomeSpeci...的行为。如果我写了这个,我会立刻知道在我的新程序中需要导入什么。当我最近看到这段代码时,我认为Callable来自标准库。不幸的是,在之前的Python中,只有一个字符(major c而不是minor c)中存在一个不同的函数,并被删除。这误导了我去寻找替代品。像functools.partial(E.S.的学分)这样的东西在某些情况下也会起作用,多亏了这些知识,但效果不太好。

当我最终在其中一个子模块中找到一个from swampy import *时,我为自己走进这个tripwire而感到愤怒(具有讽刺意味的是,我正是解决这个问题的人)。

这部分归功于:Saaj,E.S.和我自己(研究资料)

2)+3)如何同时安装多个python版本?

嗯,我看了所有的建议,对我来说,江户一号〔6〕最有效。我设法安装了python3.1,建议如下:

  • Sanket Mokashi(虚拟环境建议)
  • saaj(dockerfile的东西按应该的方式处理)
  • 拜根宫(这是最舒适的方式!)

我在这里提到这个是因为这是问题的一部分,但我不再需要这个了,我会把答案留给经过需要它的人。

在把所有这些写在我的结果总结中之后,我想感谢所有帮助我解决这个问题的人。