On Raspbian run multiple python Versions simultaniously
我有一些以前的程序,在Python3.1出现的时候。在程序中,我经常使用
1 | tvf.mi(datei_bu, text=datei_opt, command=Callable(exec_datei_opts, datei_opt)) |
现在我想再次使用我的程序,但是
最后我决定重新安装python 3.1。但是,我不知道是否可以同时安装多个python 3版本,或者当我想使用这个特殊版本时,如何为这个版本"创建"一个shell命令。
我的问题是:
- 是否有替代被移除的
callable 物体? - 如何同时使用多个Python版本?
- 如何创建匹配的shell命令?
Callable看起来很像
这是部分工作。当我跑步的时候:
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从未内置过
New in version 3.2: This function was first removed in Python 3.0 and then brought back in Python 3.2.
我在网上找到的所有关于
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想要为同样的目的重新实现
如果您仍然想尝试安装旧版本的python 3,可以尝试以下操作。我假设Raspbian是基于Debian的发行版,并且应用了相同的命令。这是
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 |
使用
这是示例代码。
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)) |
从
1 | python3.1 your_program.py |
最后我得到了我所有问题的答案。为了解决我所有的问题,我用了很多答案中的东西。他们来了:
1)是否有可调用对象的替换对象已丢失?
基本上没有。至少没有一个在这种情况下工作。我将解释为什么这不会影响我的解决方案。
我犯了一个错误,就是不看我的
我在不同的文件中定义了我的GUI组件,并将它们导入到我的主应用程序
我在编程方面不是很先进,所以我不知道,例如:
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时不必说
当我最终在其中一个子模块中找到一个
这部分归功于:Saaj,E.S.和我自己(研究资料)
2)+3)如何同时安装多个python版本?
嗯,我看了所有的建议,对我来说,江户一号〔6〕最有效。我设法安装了python3.1,建议如下:
- Sanket Mokashi(虚拟环境建议)
- saaj(dockerfile的东西按应该的方式处理)
- 拜根宫(这是最舒适的方式!)
我在这里提到这个是因为这是问题的一部分,但我不再需要这个了,我会把答案留给经过需要它的人。
在把所有这些写在我的结果总结中之后,我想感谢所有帮助我解决这个问题的人。