как создать символическую ссылку в Jython - PullRequest
2 голосов
/ 15 октября 2011

Я работаю над проектом, который использует Jython 2.2.

Похоже, в Jython 2.2 нет os.symlink () или чего-либо, что может помочь в создании символической ссылки.

Так что я подумал использовать Java createSymbolicLink (). Но createSymbolicLink () требует Java-тип данных «Путь», который я понятия не имею о том, как импортировать в Jython ...

Кто-нибудь имеет представление о том, как создать символическую ссылку в Jython (желательно без использования команд оболочки)?

P.S. Я пробовал «createSymbolicLink ()» с Java 1.6.0, и он не работал, потому что Java почему-то не распознал «Path» даже после того, как я импортировал «java.nio. *» ... Любая идея ...?

Большое спасибо!

Jack

1 Ответ

2 голосов
/ 15 октября 2011

В Java 6 нет поддержки символических ссылок. С Java 7 вы можете (не проверено):

from java.nio.file import FileSystems # requires Java 7 (July 28, 2011)

def mksymlink(target, path):
    """Make a symlink from target to path."""
    fs = FileSystems.getDefault()
    target, path = [fs.getPath('', [name]) for name in [target, path]]
    path.createSymbolicLink(target)

В Jython 2.5 реализовано os.symlink() с использованием модуля jruby posix .

В Jython 2.2 на Java 6 вам может понадобиться позвонить ln:

import os
from java.lang import Runtime

def mksymlink(target, path):
    path = os.path.abspath(path)
    process = Runtime.getRuntime().exec(["ln", "-s", target, path]);
    process.waitFor();
    process.destroy();

Для массового производства символических ссылок вы можете общаться с внешним процессом Python:

import os
from java.lang import Runtime
from java.io import PrintWriter

class Symlinker:
    def __init__(self, path):
        self.process = Runtime.getRuntime().exec(path)
        self.out = PrintWriter(self.process.getOutputStream())

    def __call__(self, target, path):
        self.out.write("%s\0%s\n" % (target, path))
        self.out.flush()

    def terminate(self):
        self.out.close()
        self.process.waitFor()
        self.process.destroy()

symlinker = Symlinker(["python", "symlinker.py"])

def mksymlink(target, path):
    symlinker(*map(os.path.abspath, [target, path]))

Где symlinker.py:

#!/usr/bin/env python
import os, sys

for line in iter(sys.stdin.readline, ''):
    target, path = line.rstrip('\n').split('\0')
    os.symlink(target, path)

Это перевод Jython / Python реализации Java / C с Создание символических ссылок с помощью Java во время выполнения .

...