2014-01-19 147 views
-1

我想制作一个自我复制的程序,它将创建一个新的Python文件,编写代码并运行它。以下是我想要的代码是:Python 3.3.3:从Python脚本运行文件?

import os 

num = 0 

fileName = 'wrm' + str(num) 
fileType = '.txt' 

finalName = fileName + fileType 
pyName = fileName + '.py' 

f = open(finalName, 'w') 
f.write("Whatever code I want to write") 
f.close() 
os.rename(finalName, pyName) 

num = num + 1 

# Here I need a command that runs the file, giving num as an 'argument'. 
+1

您可能想从[subprocess]开始(http://docs.python.org/3.4/library/subprocess.html) – thefourtheye

+0

@thefourtheye您有没有更简单的方法?我不是很高级....我不能理解。 – Kabir

+1

有可能有更好的方法来做你想做的。为什么不定义一个函数并调用它,而不是生成源代码?如果你希望它在一个单独的过程中,'multiprocessing'可以做到这一点。即使由于某种原因它必须是源代码,“compile”或“exec”可能比创建和运行文件更好。即使它必须是一个文件,创建一个模块并“导入”它来运行代码可能会更好。如果你真的需要这样做,这是可行的(正如我的答案所示),但它可能不是你的实际问题的正确答案。 – abarnert

回答

0

subprocess模块让你的方式来运行任何程序。

你的脚本不是一个程序,它是一个脚本,需要由解释程序执行。在这种情况下,您可能希望它由与您当前正在运行的完全相同的解释程序执行,该程序的可用范围为sys.executable

当你运行python,它把作为要运行脚本的第一个参数(在该脚本变得sys.argv[0]),以及任何额外的参数作为参数传递给该脚本(这成为sys.argv[1:])。

的命令行参数必须是字符串,所以你必须序列你想传递给字符串任何参数,然后反序列化他们在另一端。对于一个整数,这是微不足道的,但对于更复杂的类型它可能不是。

所以,这将是这样的:

output = subprocess.check_output([sys.executable, pyName, str(num)]) 

显然,如果你不希望捕捉到它的标准输出,或者想捕捉它的标准错误一样好,甚至要正确对待非零retcodes作为除了例外之外的东西,或者想在后台运行而不是等待,等等,确切的subprocess函数调用将会不同。但是,如果您阅读这些文档,您可能想要做的任何事情都有很好的例子。

,然后生成脚本会做这样的事情:

import sys 

num = int(sys.argv[1]) 
# whatever you wanted to do with num 
0

虽然相对较少effecient和清洁比子,你可以使用使用os.system,这将复制外壳用于执行任务, :

os.system("python filename" + num.py) or os.system("python filename%s.py" % num) 

或者它的其他目录下,你可以通过导航,

os.system("cd /filepath && python filename" + num.py)