Это заголовок раздела о функции os.symlink() в официальной документации Python 3.12, версии Python, которую я использую:
os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)
Создайте символическую ссылку, указывающую на источник с именем dst.
В Windows символическая ссылка представляет либо файл, либо каталог, и не трансформируется в цель динамически. Если цель присутствует, тип символической ссылки будет создан соответствующим образом. В противном случае символическая ссылка будет создана как каталог, если target_is_directory имеет значение True или символическую ссылку на файл (по умолчанию) в противном случае. На платформах, отличных от Windows, target_is_directory игнорируется.
Описание четвертого параметра (*) и пятого параметра (dir_fd) не приводится. Я предполагаю, что пятый параметр означает каталог, в котором следует разместить символическую ссылку, но я не уверен, что прав. Я совершенно пропустил четвертый параметр, когда писал свой код, и теперь, когда я его вижу, я понятия не имею, что туда поместить, а документация мне не подсказывает.
Это был мой код, я знаю, что он неправильный, но не знаю, что поставить четвертым параметром:
os.symlink(absold, newfn, False, dir)
Однако сообщение об ошибке, которое я получил, не было особенно полезным, учитывая, что в документе упоминаются 4, если не 5 параметров.
TypeError: symlink() takes at most 3 positional arguments (4 given)
Как мне это закодировать, чтобы символическая ссылка создавалась в том каталоге, в котором я хочу, чтобы она была? Я не запускаю из каталога, где находятся эти файлы.
Официальные документы неверны?
Хотя вопрос, который я связал как дубликат, касается, в частности, другого вызова, общий вопрос: «Что такое dir_fd / что он делает?» часть не зависит от вызова — она имеет одно и то же значение во всех системных вызовах, которые ее поддерживают, и, следовательно, во всех оболочках более высокого уровня для этих вызовов.
*
в определении функции в Python разделяет аргументы позиции и аргументы, содержащие только ключевые слова. Ты не можешь сделать os.symlink(a, b, c, d)
, ты должен os.symlink(a, b, c, dir_fd=d)
. Это обычный синтаксис Python. См. https://docs.python.org/3/reference/compound_stmts.html#function-definitions:
Параметры после «*» или «*identifier» являются параметрами только для ключевых слов и могут передаваться только в качестве аргументов ключевого слова. Параметры перед «/» являются только позиционными параметрами и могут передаваться только в виде позиционных аргументов.
Что касается dir_fd
, то это файловый дескриптор, ссылающийся на каталог, способ ссылки на каталоги по номеру в Linux. См. https://docs.python.org/3.12/library/os.html#dir-fd .
Спасибо. Я понял это сам, однако созданная символическая ссылка не открывается программным обеспечением, которое хочет ее открыть.
Четвертый параметр является просто заполнителем и не считается параметром, который означает, что все, что следует за ним, должно быть только ключевым словом. документы. Если
dir_fd
не имеет значения None, он используется для разрешения относительных путей вместо текущего рабочего каталога.