0

所以我有一个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))

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

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

4

2 回答 2

4

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

于 2013-08-30T20:35:17.823 回答
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]
于 2013-08-30T20:51:58.927 回答