【问题标题】:Python - Is there a another way to run a python script from a python script besides os.system?Python - 除了 os.system 之外,还有另一种方法可以从 python 脚本运行 python 脚本吗?
【发布时间】:2018-12-06 13:21:20
【问题描述】:

除了 os.system 之外,还有其他方法可以从 python 脚本中运行 python 脚本吗?在 python 脚本结束时,我尝试运行另一个 python 脚本,但我遇到了权限错误。这可能只是因为我的访问权限,或者可能有更好的方法在 Cloudera Data Science Workbench 中运行它,而我没有遇到权限问题?

num_of_rows_parsed_url_df = len(parsed_url_df)
num_not_on_maj_one_mil = len(parsed_url_df[parsed_url_df.GlobalRank == 1000001])
print "Number of Rows: ",num_of_rows_parsed_url_df
Number of Rows:  34091
print "Number of Requests not on the Majestic Million: ", num_not_on_maj_one_mil
Number of Requests not on the Majestic Million:  17613

import os
os.system("Proxy/Proxy_Analytics/AWS_API_Cost.py")
32256sh: 1: Proxy/Proxy_Analytics/AWS_API_Cost.py: Permission denied
os.system("Proxy/Proxy_Analytics/AWS_API_Cost.py 1")
32256sh: 1: Proxy/Proxy_Analytics/AWS_API_Cost.py: Permission denied

【问题讨论】:

  • 通过 chmod +x Proxy/Proxy_Analytics/AWS_API_Cost.py 允许 Proxy/Proxy_Analytics/AWS_API_Cost.py 和脚本本身的权限,并对您的脚本执行相同操作

标签: python cloudera os.system


【解决方案1】:

os.system 不仅不是唯一的方法,而且是一种特别糟糕的方法。 os.system 是一种安全隐患,几乎应 100% 避免。

听起来你想要的是subprocess.run。如果你想使用与当前运行相同的解释器运行另一个 Python 脚本,你可以这样做:

import os
import subprocess
import sys

subprocess.run([sys.executable, os.path.abspath('path/to/script.py')])

也就是说:您确定要将其他脚本作为单独的进程运行吗?很可能,更好的解决方案是提取 Python 函数的可重用,并将import 该库提取到您的各种脚本中。

创建 Python 模块的集合并将其打包到可重用的库中可能不是一项简单的任务,因为它使您远离“不相关的脚本集合”,而转向“打包的编程产品”。如果您有需要开始共享实现细节的脚本,那么您可能应该开始将共享代码视为一个库。

【讨论】:

  • This 是一篇关于危险 Python 函数的不错的文章,其中os.system() 被突出显示。
  • 确实,os.system 只是 C 标准库 system 调用的 Python 包装器,众所周知,它很容易受到攻击。阅读system(3) 的“注意事项”部分了解更多信息。
  • 我的目标是在 CDSW 中安排“script_1.py”在特定时间查询代理数据并为其分配 Alexa Million 等级并存储新数据。在“script_1.py”结束时,我想启动“scirpt_2.py”,它使用在“script_1.py”中创建的数据并用它做其他事情。 @Daniel Pryden
  • 我对 CDSW 一无所知,所以我无法为您提供帮助。但我认为我的答案仍然有效。
  • @sectechguy:如果您收到有关run 不存在于subprocess 模块中的错误,您可能运行的是旧版本的Python。 run 在 3.5 中被添加到 subprocess 模块中。如果不需要其他脚本的标准输出,应该可以将run替换成check_call,效果相当。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2020-09-14
  • 2023-03-20
  • 2017-03-30
  • 1970-01-01
相关资源
最近更新 更多