【问题标题】:Python 3.3.3: Running a file from a Python script?Python 3.3.3:从 Python 脚本运行文件?
【发布时间】:2014-01-19 06:01:04
【问题描述】:

我想制作一个自我复制的程序,它会创建一个新的 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'.

【问题讨论】:

  • 你可能想从subprocess开始
  • @thefourtheye 你有什么更简单的吗?我不是很先进……我不太能理解。
  • 可能有更好的方法来做你想做的事。为什么不直接定义一个函数并调用它,而不是生成源代码呢?如果您希望它在一个单独的进程中,multiprocessing 可以做到这一点。即使出于某种原因它必须是源代码,compileexec 也可能比创建和运行文件更好。即使它必须是一个文件,创建一个模块并importing 它来运行代码可能会更好。如果你真的需要这样做,它是可行的(正如我的答案所示),但它可能不是你实际问题的正确答案。
  • 对于一个非常酷的示例,您可以使用MacroPy 即时生成可运行代码而不是源代码。它的实现对你来说可能有点太高级了,但作为一个例子,它是令人难以置信的。

标签: python file python-3.3


【解决方案1】:

subprocess 模块为您提供了运行任何程序的方法。

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

当您运行python 时,它会将其第一个参数视为要运行的脚本(在该脚本中变为sys.argv[0]),并将任何其他参数作为该脚本的参数(变为sys.argv[1:])。

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

所以,它会是这样的:

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

如果您不想捕获它的标准输出,或者也想捕获它的标准错误,或者想要将非零 retcode 视为异常以外的东西,或者想要在后台运行它而不是等待,那么显然对于它等等,确切的subprocess 函数调用会有所不同。但是,如果您阅读了这些文档,就会发现您可能想做的任何事情都有很好的示例。

然后,您生成的脚本将执行以下操作:

import sys

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

【讨论】:

    【解决方案2】:

    虽然相对而言效率和清洁度不如子进程,但您可以使用 os.system,这将复制 shell 以执行任务:

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

    或者如果它在另一个目录中,您可以浏览,

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

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 2020-08-19
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多