Python 2有内置函数execfile,在Python 3.0中删除了.这个问题讨论了Python 3.0的替代方案,但自Python 3.0以来已经做了一些重大的改变.
execfilePython 3.2和未来的Python 3.x版本的最佳替代方案是什么?
是否可以在不使用if/else语句的情况下中断使用execfile函数调用的Python脚本的执行?我试过了exit(),但它不允许main.py完成.
# main.py
print "Main starting"
execfile("script.py")
print "This should print"
# script.py
print "Script starting"
a = False
if a == False:
# Sanity checks. Script should break here
# <insert magic command>
# I'd prefer not to put an "else" here and have to indent the rest of the code
print "this should not print"
# lots of lines below
Run Code Online (Sandbox Code Playgroud) 在我的一些Django应用程序中,我使用settings_local.py文件来覆盖各种环境(例如开发,测试和生产)上不同的设置.我最初使用以下代码将其内容包含在settings.py:
try:
from settings_local import *
except ImportError:
sys.stderr.write("The settings_local.py file is missing.\n")
DEBUG=False
Run Code Online (Sandbox Code Playgroud)
我最近发现了这个execfile功能,并改为:
try:
execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
sys.stderr.write("The settings_local.py file is missing.\n"
DEBUG=False
Run Code Online (Sandbox Code Playgroud)
两者都按预期工作,但我很好奇我是否遗漏了任何陷阱,一般来说哪种方法更值得推荐以及为什么.
我有一些代码加载默认配置文件,然后允许用户提供自己的Python文件作为额外的补充配置或覆盖默认值:
# foo.py
def load(cfg_path=None):
# load default configuration
exec(default_config)
# load user-specific configuration
if cfg_path:
execfile(cfg_path)
Run Code Online (Sandbox Code Playgroud)
但是有一个问题:execfile()在指定的文件中执行指令,cfg_path就像它在工作目录中一样foo.py,而不是它自己的工作目录.因此,import如果cfg_path文件执行,则指令可能会失败,例如,同一目录中的模块位于from m import x何处.mcfg_path
我如何execfile()从其参数的工作目录中,或以其他方式获得相同的结果?另外,我被告知execfile在Python 3中已弃用并且我应该使用它exec,所以如果有更好的方法我应该这样做,我全都听见了.
注意:我认为仅仅改变工作目录的解决方案是正确的.据我所知,这不会将这些模块放在解释器的模块查找路径上.
下面是我的代码的一个重要部分,基本上如果你向下滚动到该execute_subscripts()功能,你可以看到我有两个脚本运行,通过execfile哪个工作很漂亮,他们表明prints,他们将traceback错误保存到错误文件.
我试图将第二个脚本变成一个不等待自己完成的脚本,然后再转到下一个脚本.
正如你所看到的,我试图用subprocess它Popen来启动一个无声的隐藏窗口......但它似乎没有运行,我不知道如何p.communicate()正确使用该函数来检索tracebacks和/或prints.
我也...需要帮助创建某种超时/终止开关,所以如果一个下标要么通过Popen或execfile路由没有在5分钟内完成它跳过它为该循环或重试并跳过如果它立即再次失败.
我明白我可能不应该strftime在时间使用....但是这部分对我来说很好,所以我认为不需要改变它.
from datetime import date, timedelta
from sched import scheduler
from time import time, sleep, strftime
import random
import traceback
import subprocess
s = scheduler(time, sleep)
random.seed()
def periodically(runtime, intsmall, intlarge, function):
## Get current time
currenttime = strftime('%H:%M:%S')
## If currenttime is anywhere between 23:40 and 23:50 then...
if currenttime …Run Code Online (Sandbox Code Playgroud) 我让自己很困惑。我有一组 python 函数,所有这些函数都放在一个名为 (假设) 的文件中useful.py。然后我可以将模块读入我的 ipython
import useful as uf
Run Code Online (Sandbox Code Playgroud)
然后我可以访问各个功能
uf.meaning_of_life()
Run Code Online (Sandbox Code Playgroud)
等等。标准的东西。
但是 - 此文件中的某些函数会调用其他函数。我可以随时使用 调用单个函数uf.,但是相互调用的函数呢?如果一个被调用的函数eat引用了另一个被调用的函数chew,如何eat知道在哪里找到chew?我可以调用 asuf.eat和uf.chew。
我可以通过简单地执行execfile('useful.py')非常有效的操作来忽略所有这些,但我想更多地了解模块系统。
目前,当import我尝试使用我的函数时会产生错误;当我使用时execfile一切正常。
我很欣赏这可能会被解释为初学者的问题,但我是从 Matlab 背景开始接触 Python 的,我自然倾向于使用execfile. 非常欢迎指向信息的指针。
假设我有两个python脚本A.py和B.py.我正在寻找一种方法从A中运行B,方式是:
__main__(因此if __name__=="__main__"B 中的块中的代码将运行)__main__(所以它不会,例如,覆盖"__main__"sys.modules中的条目)exceptA中的条款捕获).我尝试了各种技术,但似乎都没有满足我的所有要求.
execfile("B.py", {}) 运行B,但它不认为它是主要的.execfile("B.py", {'__name__': '__main__'})让B.py认为它是主要的,但它似乎也搞砸了异常回溯打印,因此回溯指的是A中的线(即真实的__main__).imp.load_sourcewith __main__作为名称几乎可以工作,除了它实际上修改了sys.modules,从而踩到了现有的值__main__有什么方法可以得到我想要的东西吗?
(我这样做的原因是因为我正在对现有的库进行一些清理.这个库没有真正的测试套件,只有一组产生特定输出的"示例"脚本.我试图利用它们作为测试以确保我的清理不会影响库执行这些示例的能力,因此我想从我的测试套件中运行每个示例脚本.我希望能够在测试脚本中看到这些脚本的异常,以便测试脚本可以报告失败的类型,而不是仅在示例脚本引发某些异常时报告通用的SubprocessError.)
我有一个utils.py包含名为的函数的文件f1()。
通过另一个Python脚本,我可以import utils或execfile('utils.py')可以访问f1()。两种方法有什么区别?
代码是:
import sys
execfile('test.py')
Run Code Online (Sandbox Code Playgroud)
在test.py我有:
import zipfile
with zipfile.ZipFile('test.jar', 'r') as z:
z.extractall("C:\testfolder")
Run Code Online (Sandbox Code Playgroud)
此代码生成:
AttributeError ( ZipFile instance has no attribute '__exit__' ) # edited
Run Code Online (Sandbox Code Playgroud)
从python idle运行时,"test.py"中的代码有效.我正在运行python v2.7.10
我需要找到如何在Notepad ++中编写后打开我的.py文件.我发现界面比Python窗口更有用.
在一个教程中,我跟随着这个人使用
execfile(pathway)
Run Code Online (Sandbox Code Playgroud)
但是execfile在3.3中不起作用.
3.x中是否有等价的陈述?
execfile ×10
python ×9
import ×2
python-2.7 ×2
python-3.x ×2
subprocess ×2
django ×1
flow-control ×1
keyword ×1
scheduler ×1
zipfile ×1