如何将 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 解释器将接受它,但它不会接受参数!
我需要将第三方 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 解释器将接受它,但它不会接受参数!