关于Python脚本调用命令dir1/file1 -D python dir2/file2 > script.py的疑问
解读你的命令&澄清误解
首先,咱们把你贴的命令拆解开,彻底搞懂它到底在做什么:
dir1/file1 -D python dir2/file2 > script.py
命令各部分的作用
dir1/file1:这是你要执行的二进制可执行程序(不是Python脚本,你后来也确认它是系统中已存在的文件),整个命令的核心是运行这个程序,和你的script.py没有直接关联。-D python:这是传给file1的命令行参数,-D是file1这个程序自己定义的选项(类似很多工具的-h/--help),这里用来指定依赖的解释器为Python。dir2/file2:这是file1程序要处理的输入文件,也就是file1会读取这个文件的内容来做后续处理。> script.py:这是Shell的标准输出重定向,它会把file1程序运行时输出到控制台的内容(标准流stdout),写入到script.py文件里——如果之前script.py有内容,会被直接覆盖;如果file1没有输出,script.py会变成空文件。
你的核心误解
你之前以为这个命令是用script.py读取file2并生成file1,完全搞反了逻辑:这个命令的主角是file1这个第三方程序,你的script.py只是它输出内容的接收方——这就是为什么你运行后没反应:要么file1处理file2后没有输出内容,要么file1的运行没有产生标准输出。
这是调用Python函数的常规方式吗?
绝对不是!常规调用Python脚本/函数的方式是:
- 直接用Python解释器运行脚本:
python script.py 输入文件路径 - 给脚本加执行权限后直接运行:
./script.py 输入文件路径
你贴的命令是运行一个独立的二进制可执行程序,只是这个程序可能内部会调用Python(你补充的信息也提到它后台调用Python),但这和直接调用Python函数完全是两码事。
额外说下你的script.py问题
你的脚本本身也有几个语法/逻辑问题,就算用正确方式运行也会报错:
def main(): if len(sys.argv) <2: print >>sys.stderr # 没有输出任何提示内容,用户根本不知道错在哪 sys.exit(1) try: convert(sys.argv[1]) # 未定义convert函数,也没导入相关模块 except: return1 # 语法错误!应该是return 1,且捕获所有异常却不做处理,难以调试
而且脚本开头没有导入sys模块,运行会直接报NameError: name 'sys' is not defined。
调试建议
如果你想搞懂file1的用法,可以试试运行:
dir1/file1 --help # 或者 dir1/file1 -h
大部分正规命令行工具都会有帮助信息,告诉你-D选项的作用、参数格式。另外,你可以先去掉重定向,直接运行:
dir1/file1 -D python dir2/file2
看看控制台有没有输出,这样就能知道file1到底有没有产生内容,或者有没有报错信息(报错一般输出到标准错误流stderr,不会被>重定向)。
内容的提问来源于stack exchange,提问作者Tos
相关产品推荐
相关产品推荐

