在当前活动目录上运行存储在服务器上的python脚本

时间:2018-08-21 04:24:11

标签: python macos server

我的服务器上存储了一个.py脚本。假设此脚本的绝对路径为

\\100.0.0.1\_projects\_topgun\_pipeline\scripts\bin\myscript.py

在这里稍作解释,在最后一个主题中,我已经在这里的人们提供了很好的指导,从而创建了一个脚本,用于基于文件名复制和创建目录。但是,当前用户将我的COPY文件复制并粘贴到活动目录中,然后使用终端/ python启动器运行它。

我想简化一下,所以我想知道是否有一种方法可以让他们进入他们希望运行脚本的活动目录,然后右键单击调用CMD / Terminal菜单,给他们提供运行脚本的选项,他们可以按[1]来运行[myscript.py]

要系统地将其列出:

  1. 用户浏览器到他们希望在其上运行脚本的网络文件夹
  2. 它们运行终端或cmd,其中列出了所有可能运行的脚本
  3. 他们根据希望运行的脚本输入数字
  4. 脚本在活动目录上运行

如果要回答这个复杂的任务,我很乐意接受有关如何仅在活动目录上运行myscript.py的指导。另外值得注意的是,目前正在针对Mac和Windows构建此文件,但目前主要针对Windows。

谢谢,希望我的提问能力比上一个主题有所提高。

2 个答案:

答案 0 :(得分:0)

首先,您希望能够选择脚本:

available_scripts = [
  'example.com/1.py',
  'example.com/2.py'
  # and etc.
  ]

# List all scripts available
print('Available scripts:')
for ind, script in enumerate(available_scripts):
  print('[%s] %s' %(ind, script))
print('-' * 20)

# Makes user choose one
script_num =0
while True:
  try:
    script_num = int(input('Enter script number: '))
  except ValueError:
     print('Invalid input, try again')
     continue
  if script_num >= len(available_scripts) or script_num < 0:
     print('Input out of range, try again')
     continue
  break

script_url = available_scripts[script_num]
filename = 'local_' + available_scripts[script_num].split('/')[-1]

现在我们已经选择了脚本,我们需要下载它:

import urllib.request

urllib.request.urlretrieve(script_url, filename)

最后,我们需要运行它:

import subprocess

print('Running script #%s: %s' %(script_num, script_url.split('/')[-1]))
subprocess.run(['python', filename])

此外,如果您要在以后清理,则应删除文件:

import os

os.remove(filename)

答案 1 :(得分:0)

因此,这是执行远程脚本选择器的方法,该脚本的 stdout 输出将在本地执行。

文件选择器

available_scripts = [
    '~/Desktop/test.py', 'path/to/script1.py'
    # and etc.
]

# List all scripts available
print('Available scripts:')
for ind, script in enumerate(available_scripts):
  print('[%s] %s' % (ind, script))
print('-' * 20)

# Makes user choose one
script_num = 0
while True:
  try:
    script_num = int(input('Enter script number: '))
  except ValueError:
    print('Invalid input, try again')
    continue
  if script_num >= len(available_scripts) or script_num < 0:
    print('Input out of range, try again')
    continue
  break

script_path = available_scripts[script_num]

现在我们已经选择了脚本,我们需要告诉它 cwd 中有哪些文件。

就像东西

import os
files = [
    f for f in os.listdir(os.getcwd())
    if os.path.isfile(os.path.join(os.getcwd(), f))
]

现在,我们只需要建立ssh连接即可。

警告:这需要外部模块 paramiko !!

from paramiko import SSHClient
import paramiko
import sys

ssh = SSHClient()

# You should have host keys
ssh.load_system_host_keys() # you can pass a filename
# You choose how to get the password
ssh.connect(server, username=username, password=password)

现在,我们使用该ssh连接来执行脚本并捕获输出。 我们还将传递文件。

远程执行

try:
  ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(
    'pytho %s "%s"' % (script_path, files),)
except SSHException as e:
  print('Remote program execution failed:\n' + ssh_stderr)
  print(e)
  sys.exit()

现在,我们执行输出(您案例中的文件构成部分)

本地执行

# Will give us what commands the remote script wants us to execute
commands = ssh_stdout.read().decode('utf-8')

try:
  print('Running local commands...')
  eval(commands)
except Exception as e:
  print('Error while executing local commands: ' + str(e))
  sys.exit()
print('Local commands executed, finished.')


现在远程脚本中有什么?很简单:

import sys
from ast import literal_eval

print('print("huuh")')
print('print(' + str(literal_eval(sys.argv[1])) + ')') # literal_eval will transform '["filename", "filename"]' to a real list

本地脚本将执行您打印的内容。

对于您而言,您想做的是这样:

files = literal_eval(sys.argv[1])
commands= 'import os'

for file in file:
  #do stuff
  commands += '\n' + 'os.makedirs(%s)' %(the_name_of_the_dir)
print(commands)