我制作了这个小的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()
答案 0 :(得分:0)
我很确定使用输入数据提供Python脚本的方法很不稳定。不要依赖于许多级别的命令行参数解析/编码/解码。完全有可能这是你观察到的差异,在命令行(你的shell,我猜)和通过exec()
从PHP调用Python。
最好将这些数据传输到Python进程中(即将其写入Python进程的stdin,并从那里读取),或者从PHP中将其写入文件,然后从Python中读取该文件。这样做,可以确保 nothing 与作为输入数据的字节流混淆。