使用tcl中的参数调用python脚本

时间:2018-08-16 12:25:00

标签: python tcl exec zipfile

我想在我的TCL程序中执行一个具有2个参数的python函数。我的用于解压缩file.zip的python函数由以下代码定义:

# -*- coding: utf8 -*-
import zipfile 
import os.path 
import os 

def dezipFile(filezip, pathdst = ''):

    if pathdst == '': pathdst = os.getcwd() 
    zfile = zipfile.ZipFile(filezip,'r')

    for i in zfile.namelist():
            print (i)
            if os.path.isdir(i): 
                    try: os.makedirs(pathdst + os.sep + i) 
                    except: pass 
            else: 
                    try: os.makedirs(pathdst + os.sep + os.path.dirname(i)) 
                    except: pass 
                    data = zfile.read(i)                  
                    fp = open(pathdst + os.sep + i, "wb") 
                    fp.write(data)                         
                    fp.close() 
    zfile.close() 

然后,我想在我的TCL程序中执行此功能。我使用了exec。 TCL脚本:

puts "--outzip is: $outZip"
puts "--destinationDeZip is: $destinationDeZip"
set zip_status [ catch {exec python dezipFile.py ${outZip} ${destinationDeZip}} id ]
if {$zip_status == 1} {
    puts "**** Error: $id *********"
} else {
    puts "**** Pass: the zipped file $fileName is extracted *********"
}

在结果报告中,我找到了消息**** Pass: the zipped file $fileName is extracted *********。 该命令似乎已传递,但是未按预期提取压缩文件。我的程序有错误吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您需要在Python端添加一些额外的代码才能真正调用您定义的函数。

<a href="{{$get_data_slider->link}}" target="_blank"><img src="{{ asset('storage/'.$get_data_slider->file.'') }}" class="d-block w-100"></a>

if __name__ == '__main__': import sys dezipFile(*sys.argv[1:]) 会在脚本名称之后获取所有参数,然后执行sys.argv[1:]将所有参数作为单独的参数传递到dezipFile(*…)函数中。

答案 1 :(得分:1)

这不是要回答,而是要提出改进建议:我假设您知道您没有使用Python解压缩和访问Tcl中ZIP存档的内容吗?

您可能要考虑使用tcllib模块zipfile::decode作为开始:

package require Tcl 8.6
package require zipfile::decode

try {
    ::zipfile::decode::unzipfile $outZip $destinationDeZip
} on error {errMsg opts} {
    # ...
}

(假设您可以使用Tcl 8.6。)