我使用的第三方库很好但不按我想要的方式处理不存在的文件.给它一个不存在的文件,而不是提高旧的
FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt'
Run Code Online (Sandbox Code Playgroud)
它提出了一些模糊的信息:
OSError: Syntax error in file None (line 1)
Run Code Online (Sandbox Code Playgroud)
我不想处理丢失的文件,不想捕获或处理异常,不想引发自定义异常,既不想要我open文件,也不想创建它,如果它不存在.
我只想检查它是否存在(os.path.isfile(filename)将做的技巧)如果没有,那么只需要引发一个正确的FileNotFoundError.
我试过这个:
#!/usr/bin/env python3
import os
if not os.path.isfile("nothing.txt"):
raise FileNotFoundError
Run Code Online (Sandbox Code Playgroud)
什么只输出:
Traceback (most recent call last):
File "./test_script.py", line 6, in <module>
raise FileNotFoundError
FileNotFoundError
Run Code Online (Sandbox Code Playgroud)
这比"文件无语法中的语法错误"更好,但是如何用正确的消息引发"真正的"python异常,而不必重新实现它?
我发现的有关此主题的任何文档都提到构建 deb 包的“唯一”要求是拥有正确的setup.py(和requirements.txt)。例如,在dh-virtualenv 教程、stdeb 文档和Debian 的 python 库风格指南中。
但现在新的(令人惊奇的)工具,如诗,允许开发(并上传到 PyPI)Python 项目,而无需任何setup.py(此文件和其他几个文件,包括requirements.txt全部被替换pyproject.toml)。我相信flit也允许这样做。
我开发了一个由诗歌管理的 python 项目,并想将其打包到 Ubuntu/Debian 中。我想,作为一种解决方法,我仍然可以编写一个从和 一个文件setup.py中获取其值的文件(使用来自 的值手动编写)。pyproject.tomlrequirements.txtpoetry.lock
但是,有没有办法在没有任何文件的情况下做到这一点setup.py?
我想找到在python sdist中包含未被git跟踪的文件的正确方法.
.mo我的项目中的文件不会被跟踪git(就像其他一些.txt需要在安装时创建的文件一样).
我setup.py在安装时写了一个小函数来创建它们,我打电话给setup():
setup(
.
.
.
data_files=create_extra_files(),
include_package_data=True,
.
.
.
)
Run Code Online (Sandbox Code Playgroud)
请注意它们应该属于,data_dir因为文档说:
data_files选项可用于指定模块分发所需的其他文件:配置文件,消息目录,数据文件,以及不适合以前类别的任何内容.
所以,这适用于python3 setup.py install(bdist也是).该.mo文件生成并存储在正确的地方.
但是如果我想要它可以使用sdist,那么我必须将它们包含在MANIFEST.in(例如recursive-include mathmaker *.mo)中.文档确实说:
在3.1版中更改:如果未提供模板,则所有与data_files匹配的文件都将添加到MANIFEST文件中 .请参阅指定要分发的文件.
(链接没有多大帮助).
我不愿意包含*.mo文件,MANIFEST.in因为它们没有被git跟踪.而check-manifest不喜欢这种情况,它抱怨这个事实lists of files in version control and sdist do not match!
那么,有没有办法解决这种丑陋的情况?
我想从python的主脚本中将一些日志信息写入/ var/log中的文件.
当我调用时logger.info("Starting"),我在文件上得到一个PermissionError,这是很正常的,因为/ var/log中的文件属于root,而我的程序不是以root身份运行的.
我当然可以设置/var/log/my.log权限,以便myapp写入它.(例如,设置相同的组).但对我来说这看起来不是一个好习惯:如果我在另一台计算机上安装myapp怎么办?我应该在安装过程中更改日志文件的权限吗?或者还有另一种更通用的方法吗?(就像将日志发送到"系统"的通用方法一样?通用我的意思也是可移植的,什么适用于linux,freebsd等)
虽然我不确定它是否相关,但是对于信息,这里是我的代码的一些部分:
主要脚本:
import logging, logging.config
from lib import settings
settings.init()
logging.config.fileConfig(settings.logging_conf_file)
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
处理程序匹配settings.logging_conf_file,在日志配置文件中:
[handler_mainHandler]
class=FileHandler
level=INFO
formatter=defaultFormatter
filemode=w
args=('/var/log/myapp.log',)
Run Code Online (Sandbox Code Playgroud) 在我的项目的主脚本中,gettext安装_()在其他模块中用于翻译的函数(如in print(_('Something to translate'))).
正如文件所述:
_()函数[是]安装在Python的内置命名空间中,因此可以在应用程序的所有模块中轻松访问它.
所以,一切都运行良好.
唯一的问题:flake8显示错误(实际上由PyFlakes返回):
$ flake8 *.py
lib.py:2:12: F821 undefined name '_'
main_script.py:8:7: F821 undefined name '_'
Run Code Online (Sandbox Code Playgroud)
这是正常的,因为_在main_script.py和lib.py中确实没有定义.
.
??? lib.py
??? locale
? ??? de
? ??? LC_MESSAGES
? ??? myapp.mo
? ??? myapp.po
??? main_script.py
Run Code Online (Sandbox Code Playgroud)
lib.py包含这个:
def fct(sentence):
return _(sentence)
Run Code Online (Sandbox Code Playgroud)
和main_script.py这个:
#!/usr/bin/env python3
import gettext
import lib
gettext.translation('myapp', 'locale', ['de']).install()
print(_('A sentence'))
print(lib.fct('A sentence'))
Run Code Online (Sandbox Code Playgroud)
和myapp.po包含:
msgid ""
msgstr ""
"Project-Id-Version: …Run Code Online (Sandbox Code Playgroud) 我要确保在一个断言中根本不提出任何警告。
我已经尝试过,认为可能None意味着“没有”:
def test_AttrStr_parse_warnings():
"""Check _AttrStr.parse() raises proper warnings in proper cases."""
with pytest.warns(None):
_AttrStr('').parse()
Run Code Online (Sandbox Code Playgroud)
但是此断言也总是正确的,例如,即使实际发出警告,测试也不会失败:
def test_AttrStr_parse_warnings():
"""Check _AttrStr.parse() raises proper warnings in proper cases."""
with pytest.warns(None):
_AttrStr('').parse()
warnings.warn('any message')
Run Code Online (Sandbox Code Playgroud) 我希望能够跟踪几何Point对象的实例,以便在自动命名新对象时知道已经"采用"了哪些名称.
例如,如果已创建名为"A","B"和"C"的点,则下一个自动命名的Point将命名为"D".如果名为"D"的Point被删除,或其引用丢失,则名称"D"再次可用.
我的主要属性Point的对象被定义为属性,并且是非常标准x,y和name.
我按照这里描述的那样继续使用weakref.WeakSet().我把它添加到我的Point班级:
# class attribute
instances = weakref.WeakSet()
@classmethod
def names_in_use(cls):
return {p.name for p in Point.instances}
Run Code Online (Sandbox Code Playgroud)
问题是,当我实现一个Point然后删除它时,大部分时间,但并不总是,从中移除Point.instances.我注意到,如果我运行测试套件(pytest -x -vv -r w),那么如果在测试中引发了某个异常,那么实例永远不会被删除(可能的解释在下面稍后阅读).
在下面的测试代码中,在第一次删除之后p,它总是被删除Point.instances,但在第二次删除之后p,它永远不会被删除(测试结果总是相同的),并且最后一个assert语句失败:
def test_instances():
import sys
p = Point(0, 0, 'A')
del p
sys.stderr.write('1 - Point.instances={}\n'.format(Point.instances))
assert len(Point.instances) == 0
assert Point.names_in_use() == set() …Run Code Online (Sandbox Code Playgroud) 我以前使用的编辑器在保存时不会自动删除文件末尾的空白行.
原子编辑器做到了.
问题是,如果我用atom打开这样的文件,做一些更改,撤消更改并保存,文件将被git改为看,只是因为删除了这些空白行.
我知道我每次都可以告诉git忽略这个改变,但这很烦人,我宁愿不干涉git.
有没有人知道一种方法可以防止原子在保存时自动删除文件末尾的空白行?我在首选项中找不到它,也没有提供此功能的任何包.
用简单的ints:
>>> -45 % 360
315
Run Code Online (Sandbox Code Playgroud)
然而,使用decimal.Decimal:
>>> from decimal import Decimal
>>> Decimal('-45') % 360
Decimal('-45')
Run Code Online (Sandbox Code Playgroud)
我希望得到Decimal('315').
这有什么理由吗?有没有办法获得一致的行为(没有修补decimal.Decimal)?(我没有改变上下文,也找不到如何改变它来解决这种情况).
为了设置一些路径来访问我的应用程序的子目录(比如locale/),我在下面使用它settings.py:
__process_name = os.path.basename(sys.argv[0])
__abspath = os.path.abspath(sys.argv[0])
__l1 = len(__process_name)
__l2 = len(__abspath)
rootdir = __abspath[:__l2-__l1]
Run Code Online (Sandbox Code Playgroud)
然后,例如访问data/:
datadir = rootdir + "data/"
Run Code Online (Sandbox Code Playgroud)
问题是,当我运行settings.py测试(例如python3 -m py.test)时运行它,然后sys.argv[0]再不匹配myapp并且测试脚本无法访问data/.
我想知道如何处理这个问题,例如:
settings.py只保留我的应用程序,并为测试套件提供正确的(硬编码)rootdir?installdir在配置文件中定义一个配置文件,该配置文件将在安装期间设置,然后由我的应用程序(而不是上面的代码段)及其测试套件使用?sys.argv[0]的'myappname',但是,因为存在具有相同名称不同的目录,它不知道它得到正确的.(另外,如果在另一个地方安装了一个版本和一个开发版本:如何区分它们呢?)那么,处理这个问题的最佳方法是什么?
我希望能够改变输出__str__(),并希望为此添加**kwargs.
问题:似乎无法更改函数的签名.
例如:
#!/usr/bin/env python3
class my_printable_obj(object):
def __init__(self, s):
self.content = s
def __str__(self, **kwargs):
fancy = kwargs.get('fancy', '')
return str(self.content) + fancy
M = my_printable_obj("Something to print")
print(str(M))
print(str(M, fancy=' + a fancy part'))
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./test_script3str.py
Something to print
Traceback (most recent call last):
File "./test_script3str.py", line 17, in <module>
print(str(M, fancy=' + a fancy part'))
TypeError: 'fancy' is an invalid keyword argument for this function
Run Code Online (Sandbox Code Playgroud)
我注意到,尽管有TypeError消息,python确实使用了my_printable_obj.__str__()(print('here')在开始时添加一个__str__()让我们很容易观察到这一点). …