首先让我解释一下我正在尝试做什么,我想创建一个从某个目录导入文件的类(如果该文件存在),并将该文件作为脚本运行。例如:
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()
答案 0 :(得分:0)
正如我在评论中已经说过的那样,问题似乎在于您要导入的脚本而不是导入算法。 (当导入python脚本时,它会被执行,所以如果你在脚本中有不属于类或函数的东西,那些东西都会失败,那么错误信息可能指向你的导入而不是它的问题的
然而,它也可能是其他的东西(非常疯狂的文件结构,导入导入模块通过数百次调用,导致大量导入,因此有助于查看导入的脚本是什么) (并且你可以仔细检查其中的导入,python的某些实现可能不会阻止同一模块的递归导入)。
通过这些信息,可以让您更好地了解正在发生的事情(这是一个答案,因为我需要一些长度,但我希望您允许我使用比如何查找的简单建议更好的编辑它问题,就像一个实际的解决方案)。
您说您不想使用子流程,但如果您不尝试直接导入脚本,则可能需要尝试解决问题。试试:
将文件作为文本读取,然后使用 compile function生成一个字节代码,然后您可以使用exec行执行某些操作(但不要让它在您的行中最终实现,除非您只是自己从代码生成脚本,或者用户可以修改它...)
使用带有python full/path/to/script
行命令的系统作为参数。 (http://docs.python.org/library/os.html#os.system)
感谢您的回报,希望它能帮助您找到问题。