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

时间:2017-11-14 21:05:31

标签: python python-3.1 callable-object

在python 3.1发布时,我有一些旧的程序。 在程序中,我经常使用Callable()将一个函数和它的参数传递给我的TKinter应用程序:

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

现在我想再次使用我的程序,但callable - 对象已经消失了。在网络上,我发现在python 3.2中删除了这个功能,没有一个替代方案适用于我。

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

我的问题是:

  • 是否有替换Callable - 已删除的对象?
  • 如何同时使用多个python版本?
  • 如何创建匹配的shell命令?

7 个答案:

答案 0 :(得分:2)

Callable看起来很像functools.partial

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

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)))

我明白了:

5
7
9
11
13

你应该可以这样做:

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

答案 1 :(得分:1)

terminal开始,使用:

python3.1 your_program.py

答案 2 :(得分:1)

如果python 3.1不可用,就像@JoeIddon回答中的注释一样,您可能需要更改代码库。在这种情况下,您可以:

使用functools.partial

修补Callable

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

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

可替换地:

用lambda 替换Callable()有效,但承担了多次代码更改的负担。

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

替换为:

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

以下是示例代码。

$ 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:

答案 5 :(得分:1)

Python似乎没有内置Callable。您可能会将其与callable 谓词混淆,后者确实被删除然后又被带回来了:

  

3.2版中的新功能:此功能首先在Python 3.0中删除,然后在Python 3.2中恢复。

我可以在网上找到Callable的所有引用都指向swampy包(Think Python书的副产品),其中包含swampy.Gui.Callable

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__

您还可以查看this question的答案,其中OP希望为同一目的重新实现Callable

安装Python 3.1

如果您仍想尝试安装旧版本的Python 3,可以试试以下内容。我假设Raspbian是基于Debian的发行版并且适用相同的命令。这是验证您可以在Debian Jessie-compatiblebe系统上执行此操作的Dockerfile。您可以在shell中尝试RUN命令:

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

答案 6 :(得分:0)

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

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

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

我犯了错误,只是从我的TKinter应用程序中删除了代码,而没有看到我的include - 依赖项。 saaj的anwer让我重新思考,如果曾经使用过沼泽,事实上我做了。我甚至在书架上找到了等同的德语(&#34; Programmieren lernen mit python&#34;)。傻我! X}

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

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

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

import THISISTHEFORGOTTENMODULE

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

main.py:

import sub

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

这个星座导致的行为是,当我写main.py时,我没有说THISISTHEFORGOTTENMODULE.SomeSpeci...。如果我写完这篇文章,我会马上知道在新程序中我要导入的内容。当我最近看到这段代码时,我认为Callable来自标准库。不幸的是,在python之前存在一个只有一个字符(主要C而不是小c)的函数,并且被删除了。这误导了我寻找其他选择。像functools.partial这样的东西(信用到电子邮件)会在某些情况下起作用,感谢你的知识,但它并没有多次工作。

当我最终在其中一个子模块中找到from swampy import *时,我对自己踩到this tripwire感到很生气。(具有讽刺意味的是,我是解决这个问题的人)。

此部分的信用:saaj,e.s.和我自己(研究人员)

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

好吧,我查看了所有建议,对我来说,update-alternatives效果最好。我设法使用以下建议安装python3.1:

  • sanket mokashi(虚拟环境建议)
  • saaj(dockerfile的东西应该按原样运作)
  • Byeongguk Gong(这是最舒服的方式!)

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

在我的结果摘要中写下所有这些内容结束时,我要感谢帮助我解决这个问题的所有人。