Как вы можете загрузить скрипт Python в память и выполнить его, как если бы это была командная строка? - PullRequest
0 голосов
/ 12 января 2019

Мне нужно загрузить сторонний скрипт на python в память, а затем выполнить его, как если бы он был в командной строке, подобно тому, как в PowerShell вы можете сделать iex(new-object net.webclient).downloadstring("http://<my ip>/myscript.ps1"), а затем вызвать его.

Например, я хотел бы иметь мой test.py на веб-сервере, а затем локально загрузить и выполнить его в памяти с помощью переключателей командной строки, что-то вроде:

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

Я ценю, что это довольно наивно, но любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вот хакерский способ воспользоваться опцией -c для интерпретатора Python:

>>> 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, но тогда он не примет аргументы!

0 голосов
/ 12 января 2019

Я бы порекомендовал вам скачать скрипт, используя запросы, а затем выполнить его с помощью exec.

Примерно так:

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

Источники:

Почему Python eval () отклоняет эту многострочную строку и как я могу это исправить?

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

http://docs.python -requests.org / о / мастер /


Если вы хотите указать аргументы для загруженного скрипта, вы можете сделать это:

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()

Источники:

https://stackoverflow.com/a/14905087/10902809

...