通过另一个Python代码调用Python代码

时间:2013-08-30 20:30:00

标签: python operating-system call

所以我有一个python代码,叫做program1.py

要正常执行,我会执行以下操作

python program1.py -i input.dat -o output.dat

-i indicates what follows is an input file (in this case input.dat)
-o indicates the name of the output file to be written (in this case output.dat)

我试图在另一个python代码中调用程序(program1.py),如下所示:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{}   -o  Users/Steve/Desktop/{}'.format(inputFile),.format(outputFile))

这似乎不起作用。我知道我必须使用操作系统命令,但格式化“-i”和“-o”的确切方法令人费解。

有谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:4)

我认为,你应该将program1模块导入你的filename.py并在其上使用program1函数

答案 1 :(得分:4)

代码中的实际问题是您没有正确使用format。事实上,正如所写,它甚至不会编译:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{}   -o  Users/Steve/Desktop/{}'.format(inputFile),.format(outputFile))

对于system的第一个参数,您尝试使用两个占位符格式化一个字符串,并仅为其提供一个值。然后,对于第二个参数,您正在传递.format(outputFile),这是一个错误。

你可以写下来解决所有问题:

os.system('/sw/bin/python2.7 program1.py -i Users/Steve/Desktop/{}   -o  Users/Steve/Desktop/{}'.format(inputFile, outputFile))

但是,这是一种糟糕的做事方式。通常,您可以轻松地重写代码以将功能导入脚本并调用它。如果您不这样做的唯一原因是强迫子进程,multiprocessing通常仍然是更好的方法。


但有时你需要做这样的事情。在这种情况下,您仍然不应使用os.system。首先,要使用与脚本相同的解释器运行新脚本,请使用sys.executable而不是对其进行硬编码。其次,正如os.system文档或帮​​助会告诉您的那样,您应该几乎总是使用subprocess中的函数。所以:

subprocess.call([sys.executable, 'program1.py',
                 '-i', 'Users/Steve/Desktop/{}'.format(inputfile),
                 '-o', 'Users/Steve/Desktop/{}'.format(outputfile)])

这会为您解决各种问题 - 例如,您不必弄清楚如何引用文件名,以防它们有空格 - 如果您不这样做,那么不使用shell会更安全,更有效率什么都不需要它。


但是,除非您当前的工作目录恰好是'/',否则此仍然可能不适用于您。如果要使用绝对路径,则必须使用/启动它。

虽然我们正在使用它,但通常最好使用路径函数而不是字符串函数来处理路径,如os.path.join('/Users/Steve/Desktop', inputfile)中所示。


更好的是,您可能希望查找当前用户的桌面而不是硬编码该路径。 Apple建议这样做的方式需要安装pyobjc(内置Apple的Python安装,但可能不会使用您正在使用的Fink安装)。但那就简单了:

desktop = AppKit.NSSearchPathForDirectoriesInDomains(AppKit.NSDesktopDirectory,
                                                     AppKit.NSUserDomainMask, 
                                                     True)[0]