जियान मार्को Gherardi
answer की तरह खिड़कियों पर
लेकिन परिभाषित करता है os.symlink
, ताकि आपका कोड सुरक्षित रूप से विंडोज़ और लिनक्स पर काम कर सके:
import os
os_symlink = getattr(os, "symlink", None)
if callable(os_symlink):
pass
else:
def symlink_ms(source, link_name):
import ctypes
csl = ctypes.windll.kernel32.CreateSymbolicLinkW
csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32)
csl.restype = ctypes.c_ubyte
flags = 1 if os.path.isdir(source) else 0
if csl(link_name, source, flags) == 0:
raise ctypes.WinError()
os.symlink = symlink_ms
यदि आप अपनी स्क्रिप्ट को व्यवस्थापक के रूप में चलाते हैं तो सब ठीक है, अगर आप इसे उपयोगकर्ता के रूप में चलाने के लिए चाहते हैं - तो आपको grant python a permission to make symlinks - जो केवल विंडोज विस्टा + परम या पेशेवर के तहत संभव है।
संपादित:
जियान मार्को Gherardi answer एक यूनिक्स पथ का लिंक बनाता है: like/this
और यह काम नहीं करता। ठीक source.replace('/', '\\')
करना है:
# symlink support under windows:
import os
os_symlink = getattr(os, "symlink", None)
if callable(os_symlink):
pass
else:
def symlink_ms(source, link_name):
import ctypes
csl = ctypes.windll.kernel32.CreateSymbolicLinkW
csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32)
csl.restype = ctypes.c_ubyte
flags = 1 if os.path.isdir(source) else 0
if csl(link_name, source.replace('/', '\\'), flags) == 0:
raise ctypes.WinError()
os.symlink = symlink_ms
एक और तरीका है खिड़की के विस्टा + mklink
उपयोगिता का प्रयोग है। लेकिन इस उपयोगिता का उपयोग करने के लिए एक ही अनुमति की आवश्यकता है।फिर भी:
# symlink support under windows:
import os
os_symlink = getattr(os, "symlink", None)
if callable(os_symlink):
pass
else:
def symlink_ms(source, link_name):
os.system("mklink {link} {target}".format(
link = link_name,
target = source.replace('/', '\\')))
os.symlink = symlink_ms
संपादित 2:
यहाँ मैं अंत में उपयोग कर रहा हूँ है: यदि उपयोगकर्ता ऐसा करने के लिए एक विशेषाधिकार है इस स्क्रिप्ट खिड़कियों के नीचे एक लिंक बनाता है, अन्यथा यह सिर्फ नहीं है एक लिंक:
import os
if os.name == "nt":
def symlink_ms(source, link_name):
import ctypes
csl = ctypes.windll.kernel32.CreateSymbolicLinkW
csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32)
csl.restype = ctypes.c_ubyte
flags = 1 if os.path.isdir(source) else 0
try:
if csl(link_name, source.replace('/', '\\'), flags) == 0:
raise ctypes.WinError()
except:
pass
os.symlink = symlink_ms
पायथन 3.2 का प्रयास करें। – Blender
इसे एक उत्तर के रूप में जोड़ें और मैं इसे सही के रूप में चिह्नित करूंगा। – xaav
@xaav, चूंकि ब्लेंडर उत्तर हटा दिया गया था (मुझे नहीं पता क्यों), क्या आप मेरे उत्तर को सही के रूप में चिह्नित करने का समर्थन कर सकते हैं, क्योंकि इससे समस्या का समाधान ठीक हो जाता है? धन्यवाद! –