2014-01-19 191 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)