php exec()的一个python脚本

时间:2015-02-08 01:41:19

标签: php python

我制作了这个小的PHP代码来执行我将使用的python脚本,但它返回一个空数组。 Python和php文件在同一目录中,我使用的是VISTA。 Python脚本应该接收一个表示文件中信息的字符串,所以在exec()中我模拟了它。在命令行中,它工作正常并在此示例中打印:

content-type: text/html

Smiles

php文件

$out=''
exec("python convert_str.py Content-Type: text/html,,('ref', {'Asay_parameter': ['grfbg'], 'Smiles': ['535'], 'Cell_type': ['4t4t4'], 'Subcellular': ['4trgdf'], 'CAS': ['12233'], 'target_type': ['derj,.i'], 'LAB': ['4t4t'], 'Species': ['4t34t4'], 'Bio_target': ['vgery4'], 'strain': ['wde'], 'Unity': ['htht5u'], 'Tissue': ['kukl'], 'value': ['gjyy'], 'Observations': ['gergh'], 'Experimental_error': ['tht56'], 'InchI': ['2435d'], 'Comparisons': ['thyt5'], 'Assay_ID': ['hj6yu'], 'Conditions': ['345y4'], 'Institution': ['4t'], 'Mol_name': ['3r5rg']})",$out) ;
print_r($out);

python文件:

#!C:\Python27\python.exe


print "Content-Type: text/html\n"

import sys
import ast
superstring= sys.argv[1:]


def join_strings(megastring):

    total=''
    for substring in superstring:        
        total+=substring
    return total


def convert(string):

    save=''
    count=0
    for c in string:

        if c=='{' :
            ini=count
        elif c=='}':
            end=count+1
        count+=1

    save+=string[ini:end]
    final = ast.literal_eval(save)

    return final

def mol_id_type(info_dict):

    if info_dict['Smiles']!='':
        return 'Smiles'
    elif info_dict['InchI']!='':
        return 'InchI'
    else:
        return 'CAS'

def mol_id(info_dict,tp):
    """returns the id itself"""
    return info_dict[tp]




large=join_strings(superstring)
dic=convert(large)
mol_type=mol_id_type(dic)
identification=mol_id(dic,mol_type)

print mol_type

php的输出:

array()

1 个答案:

答案 0 :(得分:0)

我很确定使用输入数据提供Python脚本的方法很不稳定。不要依赖于许多级别的命令行参数解析/编码/解码。完全有可能这是你观察到的差异,在命令行(你的shell,我猜)和通过exec()从PHP调用Python。

最好将这些数据传输到Python进程中(即将其写入Python进程的stdin,并从那里读取),或者从PHP中将其写入文件,然后从Python中读取该文件。这样做,可以确保 nothing 与作为输入数据的字节流混淆。