如何将 sh 脚本定向到 运行 一个 python 脚本?

how to direct a sh script to run a python script?

我写了一个 python 脚本,它调用两个文件来执行一些计算,并要求为新文件命名以放置计算,所以我的代码运行如下:

python code.py in_file1 in_file2 outfile

现在,我有几个文件需要相同的计算,并且它们的名称只改变最后的数字,所以我想做一个脚本,在一个文件夹中获取不同的需要的文件来执行 python 脚本并根据给定的 in_file1 (infield_2 实际上不会改变)命名仅更改 las 编号的输出。

我尝试了一些简单的方法但没有用

#!/bin/bash
python code.py in_file[19]* infile_2 outfile[19]*

我从 python 的用法中得到一个错误,说用法:python code.py [-h] in2 out unrecognized arguments

我确信 code.py 有效,我只是想腾出时间一次处理一个文件。谢谢你。我是 python 和 linux 的新手,感谢您提供的任何帮助。

您可以在 Python

中执行相同的操作
from subprocess import call

fname="in_file{} infile2 outfile{}"
for x in xrange(1,11):
    d=call(["python","code.py",fname.format(x,x)])
    if d:
        print "Error executing: {}".format(d)

如果执行以下

fname="in_file{}"
for x in xrange(1,11):
    print ["python","code.py",fname.format(x)]

它将打印以下内容

['python', 'code.py', 'in_file1']
['python', 'code.py', 'in_file2']
['python', 'code.py', 'in_file3']
['python', 'code.py', 'in_file4']
['python', 'code.py', 'in_file5']
['python', 'code.py', 'in_file6']
['python', 'code.py', 'in_file7']
['python', 'code.py', 'in_file8']
['python', 'code.py', 'in_file9']
['python', 'code.py', 'in_file10']

您可以在 中执行此操作:

import os

name = "in_file%d"
for i in range(1, 21):
    os.system("python code.py in_file{} in_file2 outfile{}".format(i, i))

其工作方式如下,os 库调用输出的字符串:

>>> for i in range(1, 21):
...     "python code.py in_file{} in_file2 outfile{}".format(i, i)
... 
'python code.py in_file1 in_file2 outfile1'
'python code.py in_file2 in_file2 outfile2'
'python code.py in_file3 in_file2 outfile3'
'python code.py in_file4 in_file2 outfile4'
'python code.py in_file5 in_file2 outfile5'
'python code.py in_file6 in_file2 outfile6'
'python code.py in_file7 in_file2 outfile7'
'python code.py in_file8 in_file2 outfile8'
'python code.py in_file9 in_file2 outfile9'
'python code.py in_file10 in_file2 outfile10'
'python code.py in_file11 in_file2 outfile11'
'python code.py in_file12 in_file2 outfile12'
'python code.py in_file13 in_file2 outfile13'
'python code.py in_file14 in_file2 outfile14'
'python code.py in_file15 in_file2 outfile15'
'python code.py in_file16 in_file2 outfile16'
'python code.py in_file17 in_file2 outfile17'
'python code.py in_file18 in_file2 outfile18'
'python code.py in_file19 in_file2 outfile19'
'python code.py in_file20 in_file2 outfile20'
>>> 

shell 只是将通配符 in_file[19]* 扩展到所有匹配文件的列表中。这里没有循环。如果你想要一个循环,你将需要一个显式循环,比如

#!/bin/bash
for file in in_file[19]*; do
    python code.py "$file" infile_2 "out${file#in}"
done

其中变量 file 依次分配给每个匹配的文件,并且变量替换 ${var#prefix} 扩展为 var 的值并删除任何字符串 prefix从头开始。

顺便说一句,如果您使 code.py 可执行并确保它具有正确的 shebang line.

,则 python 是多余的

另请注意,[19] 匹配单个字符,因此您的通配符匹配任何名称以 in_file1in_file9 开头的文件,但不匹配其他文件。我猜你可能不是这个意思。