如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
我来过这里:
还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.
永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Run Code Online (Sandbox Code Playgroud)
我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:
相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.
上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.
有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
在我过于复杂的简单内容的无尽追求中,我正在研究最"Pythonic"的方式,在Python egg包中的典型' config.py '中提供全局配置变量.
传统方式(aah,good ol'#define!)如下:
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']
Run Code Online (Sandbox Code Playgroud)
因此,全局变量以下列方式之一导入:
from config import *
dbname = MYSQL_DATABASE
for table in MYSQL_DATABASE_TABLES:
print table
Run Code Online (Sandbox Code Playgroud)
要么:
import config
dbname = config.MYSQL_DATABASE
assert(isinstance(config.MYSQL_PORT, int))
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但有时可能有点混乱,特别是当你试图记住某些变量的名称时.此外,提供了一个"配置"对象,用变量的属性,可能会更加灵活.所以,从bpython config.py文件中取得领先,我想出了:
class Struct(object):
def __init__(self, *args):
self.__header__ = str(args[0]) if args else None
def __repr__(self):
if self.__header__ is None:
return super(Struct, self).__repr__()
return self.__header__
def next(self):
""" Fake iteration functionality.
"""
raise StopIteration
def …Run Code Online (Sandbox Code Playgroud) 我需要存储Python应用程序的配置(键/值),我正在寻找将这些配置存储在文件中的最佳方法.
我遇到Python的ConfigParser,我想知道INI文件格式现在是否真的合适?!是否存在更新的格式或INI仍然是推荐的方式?(XML,JSON,...)
请分享您的意见/建议......
我有一个配置文件abc.txt,看起来有点像:
path1 = "D:\test1\first"
path2 = "D:\test2\second"
path3 = "D:\test2\third"
Run Code Online (Sandbox Code Playgroud)
我想从abc.txt我的程序中读取这些路径以避免硬编码.
我使用Python和Django来创建我们存储在源代码控制中的Web应用程序.通常设置Django的方式,密码在settings.py文件中以纯文本形式显示.
以纯文本格式存储我的密码会让我遇到许多安全问题,特别是因为这是一个开源项目,我的源代码将受版本控制(通过git,在Github上,供整个世界查看!)
问题是,在Django/Python开发环境中安全地编写settings.py文件的最佳做法是什么?
我正在使用YAML配置文件.所以这是在Python中加载我的配置的代码:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
Run Code Online (Sandbox Code Playgroud)
此代码实际上创建了一个字典.现在的问题是,为了访问值,我需要使用大量的括号.
YAML:
mysql:
user:
pass: secret
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
print(config['mysql']['user']['pass']) # <--
Run Code Online (Sandbox Code Playgroud)
我更喜欢这样的东西(点符号):
config('mysql.user.pass')
Run Code Online (Sandbox Code Playgroud)
所以,我的想法是利用PyStache render()接口.
import os
import yaml
with open('./config.yml') as file:
config = yaml.safe_load(file)
import pystache
def get_config_value( yml_path, config ):
return pystache.render('{{' + yml_path + '}}', config)
get_config_value('mysql.user.pass', config)
Run Code Online (Sandbox Code Playgroud)
这会是一个"好"的解决方案吗?如果没有,什么是更好的选择?
附加问题[已解决]
我决定使用IljaEverilä的解决方案.但现在我还有一个问题:你如何在DotConf周围创建一个包装器Config类?
以下代码不起作用,但我希望您了解我正在尝试做的事情:
class Config( DotDict ):
def __init__( self ):
with open('./config.yml') as file: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个程序,它有一个设置窗口,我可以在其中更改程序的各种参数.在某种配置文件中读取/保存它们的最佳方法是什么?我知道有些软件和游戏使用.ini文件或类似系统.我怎样才能在Python中实现这一目标?
在面向对象编程中使用配置的pythonic方法是什么?
我想到了以下2个设置:
class Main():
def __init__(self):
self.config = ConfigClass("config_file.cfg")
self.worker = WorkerClass(self.config.USER_NAME)
self.worker2 = WorkerClass2(self.config)
def run(self):
self.worker.work()
self.worker2.work()
class ConfigClass():
def __init__(self, file_name):
self.config = ConfigParser.ConfigParser()
self.config.read(file_name)
@property
def USER_NAME(self):
return self.config.get("USER", "NAME")
class WorkerClass():
def __init__(self, user_name):
self.user = user_name
def work(self):
print(self.user)
class WorkerClass2():
def __init__(self, config):
self.config = config
self.user = self.config.USER_NAME
def work(self):
print(self.user)
Run Code Online (Sandbox Code Playgroud)
是首选传递配置对象还是仅传递所需的字符串,还是有更好的不同方法我没有提到?
提前致谢。
我从这里获取了Flask-Admin auth示例并略微更改了它.
我在下面的视图中添加了以下块,但它没有显示导出按钮.我期待它将导出选项添加到管理视图.它会打印---superuser到控制台.
if current_user.has_role('superuser'):
can_export = True
print ' ---- superuser '
Run Code Online (Sandbox Code Playgroud)
我以前多次使用导出功能.如果我把声明放在can_export = True下面,class MyModelView(sqla.ModelView):我将使用它作为控制基于用户角色创建/编辑/ etc的访问的示例.例如,我想要一个只读的角色,其中can_create = False,can_edit = False等.
有人可以帮忙吗?有人能告诉我我做错了什么吗?
==
这是整个视图.
# Create customized model view class
class MyModelView(sqla.ModelView):
def is_accessible(self):
if not current_user.is_active or not current_user.is_authenticated:
return False
if current_user.has_role('superuser'):
return True
return False
def _handle_view(self, name, **kwargs):
"""
Override builtin _handle_view in order to redirect users when a view is not accessible.
"""
if current_user.has_role('superuser'):
can_export …Run Code Online (Sandbox Code Playgroud) 我意识到之前有人问过这个问题(在 Python 中使用设置文件的最佳实践是什么?)但是看到 7 年前有人问过这个问题,我觉得有必要再次讨论一下技术是如何发展的。
我有一个 python 项目,需要根据环境变量的值使用不同的配置。由于使用环境变量来选择配置文件很简单,我的问题如下:
当基于环境需要多个配置时,在python中设置配置文件的最佳实践是什么格式?
我意识到 python 带有一个 ConfigParser 模块,但我想知道使用 YAML 或 JSON 等格式是否更好,因为它们易于跨语言使用而越来越受欢迎。当您有多个配置时,哪种格式更容易维护?
我在 YAML 中有一个配置文件,当前使用 yaml.safe_load 作为字典加载。为了方便编写我的代码,我更愿意将它作为一组嵌套对象加载。引用字典的更深层次很麻烦,并且使代码更难阅读。
例子:
import yaml
mydict = yaml.safe_load("""
a: 1
b:
- q: "foo"
r: 99
s: 98
- x: "bar"
y: 97
z: 96
c:
d: 7
e: 8
f: [9,10,11]
""")
Run Code Online (Sandbox Code Playgroud)
目前,我访问诸如
mydict["b"][0]["r"]
>>> 99
Run Code Online (Sandbox Code Playgroud)
我希望能够做的是访问相同的信息,如
mydict.b[0].r
>>> 99
Run Code Online (Sandbox Code Playgroud)
有没有办法像这样将 YAML 加载为嵌套对象?或者我是否必须滚动自己的类并递归地将这些字典翻转为嵌套对象?我猜namedtuple可以让这更容易一些,但我更喜欢整个事情的现成解决方案。
python ×12
yaml ×3
app-config ×1
class ×1
config ×1
django ×1
egg ×1
flask ×1
flask-admin ×1
import ×1
ini ×1
json ×1
oop ×1
python-2.7 ×1
python-3.x ×1
security ×1
settings ×1