如何将 python 脚本加载到内存中并像命令行一样执行它?

How can you load a python script into memory and execute it as if it was the command line?

我需要将第三方 python 脚本加载到内存中,然后像在命令行上一样执行它,类似于在 PowerShell 中您可以执行的操作 iex(new-object net.webclient).downloadstring("http://<my ip>/myscript.ps1") 然后调用它。

例如,我想将我的 test.py 放在 Web 服务器上,然后使用命令行开关在本地下载并在内存中执行它,例如:

load("http://<ip>/test.py")
exec("test.py -arg1 value -arg2 value")

我很欣赏这很天真,但感谢任何帮助,谢谢!

我建议你使用requests下载脚本,然后用exec执行。

像这样:

import requests
url="https://gist.githubusercontent.com/mosbth/b274bd08aab0ed0f9521/raw/52ed0bf390384f7253a37c88c1caf55886b83902/hello.py"
r=requests.get(url)
script=r.text
exec(script)

来源:

Why is Python's eval() rejecting this multiline string, and how can I fix it?

https://www.programiz.com/python-programming/methods/built-in/exec

http://docs.python-requests.org/en/master/


如果您想为下载的脚本指定参数,您可以这样做:

import requests
import sys
sys.argv = ['arg1', 'arg2']
url="https://gist.githubusercontent.com/itzwam/90cda6e05d918034e75c651448e6469e/raw/0bb293fba68b692b0a3d2b61274f5a075a13f06d/blahblah.py"
script=requests.get(url).text
exec(script)

要点:

import sys

class Example(object):
    def run(self):
        for arg in sys.argv:
            print arg
if __name__ == '__main__':
    Example().run()

来源:

这是一种利用 Python 解释器的 -c 选项的 hacky 方法:

>>> import subprocess
>>> pycode = """
... import sys
... if sys.argv[1] == 'foo':
...     print('bar')
... else:
...     print('unrecognized arg')
... """
>>> result = subprocess.run(['python', '-c', pycode, 'bar'], stdout=subprocess.PIPE)
>>> print(result.stdout.decode())
unrecognized arg

>>> result = subprocess.run(['python', '-c', pycode, 'foo'], stdout=subprocess.PIPE)
>>> print(result.stdout.decode())
bar

这可能会出现一些问题,例如某些平台会限制您作为参数传递的内容的大小。我尝试使用 stdin 来做到这一点,Python 解释器将接受它,但它不会接受参数!