的Python 3.6.2

下面的代码的问题是正在运行,它将引发异常。
但是进入调试器后,它可以完美运行。我在调试器中停止的位置在注释中标记为断点。

我在IDE和外壳程序中都尝试了该命令。引发异常。因此,此问题与IDE不相关。

这种情况使我有些震惊。
我制作了一个视频:https://www.youtube.com/watch?v=OUcMpEzooDk

你能给我踢一下吗?怎么可能?

注释下面的代码(与问题无关,但仅出于好奇)。

这是与Django Web框架一起使用的实用程序。
用户上载文件,它们被放入媒体目录。

当然,Django知道媒体目录的合并位置。
然后Django保留相对于媒体的数据库路径。像这样:


it_1 / 705fad82-2f68-4f3c-90c2-116da3ad9a40.txt'
e5474da0-0fd3-4fa4-a85f-15c767ac32d4.djvu


我想确切地知道保存在媒体中的文件与数据库中的路径相对应。没有多余的文件,不缺。

码:

from pathlib import Path

class <Something>():
    def _reveal_lack_extra_files(self):

        path = os.path.join(settings.BASE_DIR, '../media/')

        image_files = Image.objects.values_list("file", flat=True)
        image_files = [Path(os.path.join(path, file)) for file in image_files]

        item_files = ItemFile.objects.values_list("file", flat=True)
        item_files = [Path(os.path.join(path, file)) for file in item_files]

        sheet_files = SheetFile.objects.values_list("file", flat=True)
        sheet_files = [Path(os.path.join(path, file)) for file in sheet_files]

        expected_files = set().union(image_files, item_files, sheet_files)

        real_files = set()

        glob_generator = list(Path(path).glob("**/*"))

        for posix_path in glob_generator:
            if os.path.isfile(posix_path._str): # Breakpoint
                real_files.add(posix_path)


        lack = expected_files.difference(real_files)
        extra = real_files.difference(expected_files)

        assert bool(lack) == False, "Lack of files: {}".format(lack)
        assert bool(extra) == False, "Extra files: {}".format(extra)


追溯:

/home/michael/PycharmProjects/venv/photoarchive_4/bin/python /home/michael/Documents/pycharm-community-2017.1.5/helpers/pydev/pydevd.py --multiproc --qt-support --client 127.0.0.1 --port 43849 --file /home/michael/PycharmProjects/photoarchive_4/manage.py checkfiles
warning: Debugger speedups using cython not found. Run '"/home/michael/PycharmProjects/venv/photoarchive_4/bin/python" "/home/michael/Documents/pycharm-community-2017.1.5/helpers/pydev/setup_cython.py" build_ext --inplace' to build.
pydev debugger: process 3840 is connecting

Connected to pydev debugger (build 171.4694.67)
Traceback (most recent call last):
  File "/home/michael/Documents/pycharm-community-2017.1.5/helpers/pydev/pydevd.py", line 1591, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/home/michael/Documents/pycharm-community-2017.1.5/helpers/pydev/pydevd.py", line 1018, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/home/michael/Documents/pycharm-community-2017.1.5/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/home/michael/PycharmProjects/photoarchive_4/manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/michael/PycharmProjects/venv/photoarchive_4/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/home/michael/PycharmProjects/photoarchive_4/general/management/commands/checkfiles.py", line 59, in handle
    self._reveal_lack_extra_files()
  File "/home/michael/PycharmProjects/photoarchive_4/general/management/commands/checkfiles.py", line 39, in _reveal_lack_extra_files
    if os.path.isfile(posix_path._str):
AttributeError: _str

Process finished with exit code 1

最佳答案

您在路径上使用_str属性,该属性未记录,不能保证设置。通常,下划线前缀表示这是用户代码不应使用的私有属性。如果要将路径转换为字符串,只需使用str(the_path)

但是在这种情况下,您不需要这样做:Path对象具有一个is_file方法,您可以调用该方法。另一种可能性是将Path对象本身传递给os.path.isfile函数,Python 3.6支持该函数。

关于python - 如果我在断点处停止,异常消失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46815807/

10-12 19:26