从源代码(或Heroku)

时间:2015-05-19 08:20:40

标签: python django heroku version

我们运行一个名为inteokej.nu的站点,我需要找出它运行的Python版本。我把所有文件都拉到了我的电脑上,但我不知道是否以及如何从中查找版本号?该网站托管在Heroku上,也许有一种方法可以找到某种Heroku命令的版本?

至于现在,我没有任何改变任何代码的可能性(例如,添加代码段来获取该版本)。

提前致谢!

4 个答案:

答案 0 :(得分:3)

取决于您的需求。 (a)您运行的版本或(b).pyc文件下的版本是否已编译?

a。如果您需要了解正在运行的python 版本,请执行以下操作:

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)
>>> print sys.version_info.major
2
>>> print sys.version_info.minor
7
>>> print sys.version_info.micro
3
>>> print '%s.%s.%s' % (sys.version_info.major, sys.version_info.minor, sys.version_info.micro)
2.7.3

b。如果您想知道编译.pyc文件下的python 版本,请执行以下操作:

>>> f = open('somefile.pyc')
>>> magic = f.read(4)
>>> magic
'\x03\xf3\r\n'
>>> magic.encode('hex')
'03f30d0a'
>>> import struct
>>> struct.unpack("<HH", magic)
(62211, 2573)
>>> struct.unpack("<HH", magic)[0]
62211

已知值列在python源文件Python/import.c中。这里是Python 2.7.10rc1的已知值:

   Python 1.5:   20121
   Python 1.5.1: 20121
   Python 1.5.2: 20121
   Python 1.6:   50428
   Python 2.0:   50823
   Python 2.0.1: 50823
   Python 2.1:   60202
   Python 2.1.1: 60202
   Python 2.1.2: 60202
   Python 2.2:   60717
   Python 2.3a0: 62011
   Python 2.3a0: 62021
   Python 2.3a0: 62011 (!)
   Python 2.4a0: 62041
   Python 2.4a3: 62051
   Python 2.4b1: 62061
   Python 2.5a0: 62071
   Python 2.5a0: 62081 (ast-branch)
   Python 2.5a0: 62091 (with)
   Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
   Python 2.5b3: 62101 (fix wrong code: for x, in ...)
   Python 2.5b3: 62111 (fix wrong code: x += yield)
   Python 2.5c1: 62121 (fix wrong lnotab with for loops and
                        storing constants that should have been removed)
   Python 2.5c2: 62131 (fix wrong code: for x, in ... in listcomp/genexp)
   Python 2.6a0: 62151 (peephole optimizations and STORE_MAP opcode)
   Python 2.6a1: 62161 (WITH_CLEANUP optimization)
   Python 2.7a0: 62171 (optimize list comprehensions/change LIST_APPEND)
   Python 2.7a0: 62181 (optimize conditional branches:
            introduce POP_JUMP_IF_FALSE and POP_JUMP_IF_TRUE)
   Python 2.7a0  62191 (introduce SETUP_WITH)
   Python 2.7a0  62201 (introduce BUILD_SET)
   Python 2.7a0  62211 (introduce MAP_ADD and SET_ADD)

要解决您的问题,您可以递归遍历目录并从每个.pyc文件中提取值,并使用每个值/版本的文件列表填充字典。请参阅以下示例:

import os, struct

your_path = '/your/path' # <- enter your path here
values = {}

for root, dirs, files in os.walk(your_path):
    for file in files:
        if file.endswith('.pyc'):
            full_path = os.path.join(root, file)
            value = struct.unpack("<HH", open(full_path).read(4))[0] # <- evtl. enclose this in a try block
            if not values.has_key(value):
                values[value] = []
            values[value].append(full_path)
            print '%s %s' % (value, full_path)

for value, files in values.items():
    print 'Following files have value %s' % (value)
    for file in files:
        print '    %s' % (file)

如果你在Linux下,你可以使用以下一行突击队来解决你的问题(感谢Neftas建议!):

dir=/your/path; find ${dir} -name "*.pyc" | while read file; do head -c 2 ${file} | od -d | head -n 1 | awk -v z=${file} -F ' ' '{print $2 "\t" z}'; done

这将输出一个包含值和文件名的列表,如下所示:

62211   /usr/lib/pymodules/python2.7/reportbug/ui/urwid_ui.pyc
62211   /usr/lib/pymodules/python2.7/reportbug/debbugs.pyc
62211   /usr/lib/pymodules/python2.7/reportbug/checkbuildd.pyc
...
62161   /usr/lib/pymodules/python2.6/debianbts.pyc
62161   /usr/lib/pymodules/python2.6/fpconst.pyc
62161   /usr/lib/pymodules/python2.6/SOAPpy/Server.pyc
...

答案 1 :(得分:2)

似乎缺少最简单的答案(对于Heroku):

在经过身份验证的终端中登录Heroku bash会话:

heroku run bash --app YOURAPPNAME

然后输入:

python --version

完成

答案 2 :(得分:1)

您想知道在Heroku上运行代码的运行时。在撰写本文时,新应用程序默认为[fileList enumerateObjectsUsingBlock:^(NSString *string, NSUInteger index, BOOL *stop) { [[NSFileManager defaultManager]copyItemAtPath:strdestination toPath:toPath error:&Error]; }]; 运行时。这可能已经在'runtime.txt&#39;中修改过了。文件,以便找出它是否已设置:

Python 2.7.9

答案 3 :(得分:0)

如果您无法访问源代码,我可以看到服务器正在使用Gunicorn 0.17.2,它与Python 2.x&gt; = 2.6兼容,它排除了Python 3。