您的代码中的实际问题是您没有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]