所以我有一个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”的确切方法令人费解。
有谁能告诉我我做错了什么?
答案 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]