0

我有许多通过以下方式引用 Python 程序的脚本:

python -c "execfile('myfile.py'); readFunc(param='myParam', input='blahblah')"

界面。我想做的在概念上很简单:开发一个更模块化的系统,它有一个“主”接口和一个普通的 Python CLI 接口,然后调用这些函数,同时维护现有接口,所以为使用它而构建的脚本仍然有效。

这可能吗?

理想情况下,如果我打电话

python myFile readFunc myParam blabblah

它会是这样的:

main(sys.argv):
     readFunc(sys.argv[2], sys.arg[3])

我已经尝试过类似的方法,但效果并不理想。是否可以保留两个接口/调用方法?

谢谢!

4

2 回答 2

0

想到的第一个想法源于execfile()函数的可选参数。您可能可以执行以下操作:

#!python
def main(args):
    results = do_stuff()
    return results

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

if __name__ == 'execfile':
    main(args)

...然后当您想通过execfile()为它的可选globals参数提供字典来调用它时:

#!sh
python -c 'execfile(myfile, {"__name__":"execfile", "args":(1,2,3)}); ...'

当您通过调用您的功能时,这确实需要一些额外的工作,-c因为您必须记住传递该字典并覆盖'__name__'...通过我想您实际上可以使用任何有效的 Python 标识符。这只是__name__最接近您实际所做的事情。

下一个想法感觉有点,但依赖于对__file__全局标识符的明显处理。python -c如果正在导入或执行文件,则在调用和设置时似乎未设置。所以这有效(至少对于 CPython 2.7.9):

#!/usr/bin/env python
foo='foo'
if __name__ == '__main__' and '__file__' not in globals():
    print "Under -c:", foo

elif __name__ == '__main__':
    print "Executed standalone:", foo

...如果您使用它,请不要给我信用。它看起来 ...

……嗯……

... 只是 ...

....错了

于 2015-03-10T06:16:07.283 回答
0

如果我理解这个

python myFile readFunc myParam blabblah

正确地,您想解析argv[1]为要执行的命令名称。

所以就这样做

if __name__ == '__main__':
    import sys
    if len(sys.argv) < 2 or sys.argv[1].lower() == 'nop' or sys.argv[0] == '-c': # old, legacy interface
        pass
    elif sys.argv[1].lower() == 'readfunc': # new one
        readFunc(sys.argv[2:])

第二部分在直接执行文件时执行(通过python file.py readFunc myParam blabblah或通过python -m file readFunc myParam blabblah

当使用“legacy”接口时,“nop”/空argv分支开始发挥作用:在这种情况下,您很可能没有给出 cmdline 参数,因此可以假设您不想执行任何操作。

这使得情况和以前一样:readFunc标识符被导出并且可以-c像以前一样在脚本中使用。

于 2015-03-10T06:41:36.477 回答