我要使用非常长(比subprocess.call
个字符长)的cwd运行260
(或任何其他子过程函数)。我正在使用最新的Windows 10。
我读到here表示,为了支持长路径,您必须设置注册表项,或者在路径前面添加\\?\
。我都做过。
如果我要运行的可执行文件具有较长的路径,则它可以工作。但是,如果cwd路径很长,则无法使用:
import os, sys
import subprocess
PATH_TO_WRITE_EXE = r"C:\Windows\write.exe"
print(os.path.isfile(PATH_TO_WRITE_EXE))
# error:
my_cwd = "\\\\?\\C:\\a\\really\\long\\path\\a\\really\\long\\path\\a\\really\\long\\path\\a\\really\\long\\path\\a\\really\\long\\path\\a\\really\\long\\path"
print(os.path.isdir(my_cwd))
# no error:
#my_cwd = "\\\\?\\C:\\a\\not\\so\\long\\path"
#print(os.path.isdir(my_cwd))
o = subprocess.call([PATH_TO_WRITE_EXE], timeout=None, cwd=my_cwd)
print(o)
请注意,os.path.isdir()
在短路径和长路径上均返回True
。
如何在Windows 10上使用长路径作为cwd?
答案 0 :(得分:1)
这只是一个概念证明,您可能会想做一些不同的事情,但这是一个“答案”,如果您以admin身份运行脚本,该答案将起作用(这是一个坏主意……也许吗? (取决于范围)。
import os
import win32file
import subprocess
long_path = '\\\\?\\C:\\Temp\\3d\\RsTYjcEwAA26\\aFmtI0e\\v\\ZZ7\\AWgMBtUP5\\JRGtyZXFj2\\f2rqXnYX3yJ4\\39X11fdRbYEA\\NtPySHqx\\htyDGAtZWv8NDK\\d2VRFFJPuBUVXET\\2QSlBOlMkgO8h\\mES\\sQfPZ1nBAKZNIogOb\\wyGm5Z0RwHV\\n54Si\\2BqDwGnK6TOxjs2P\\p4SnwEre4\\KQzs1NXu5QEZcuZOIct\\YrMfsGq5g5gnMN69ko\\QFIq\\J4IKjZ3vxNrC\\OVDWtz\\Jp1H0M1UclBJqeBuX\\bjN7dA\\lCFmKDg7G1\\OhYtim9AxgX9Bm9\\vrLaaL\\KLvkkJeI0ofdwb\\Es\\ZJi3Q54oIXbQ8NOi10\\VR\\HH3\\O\\5\\zn7\\7EKj96k3BC\\8Q1OqP\\FdX8RLhl1Ce\\mPG\\OtmJWbzFk\\AheYZ8Ypwo\\085dmIvlrg\\Y8tmeJt\\cDYqXPq\\G6EYcqVXaLxv\\XXq6tIfVDhv8WoF\\xM\\PCYkVfFT1Uam9N0e\\G9PfRMOv\\GUWbc6eot4aEuVQIMd\\0NMEq9iDzqgLGOJx09\\HpUN5rBfaq9\\Ve\\Tp0E\\wpXyehjLotcDa4x\\HlBy1LMD83sxzQF0\\1\\NH1be07kdb61aomggou\\D0\\SF\\n0NLPfYTEh\\3k1AooSmx4y2CS6Mrp\\sgAd9N6x1v31jZ\\hof1X6XGdBAU8\\zyzuxVDHuX54PiYW0\\nVJc8\\r\\ukx63N2kY\\6gf8dhUTYad\\L8w4JWwZq\\iixvKOcH13FXljY5D\\zgGuUlXFH1hd\\2Ykw1isPKOKXR4Osv1U\\ncmRIMWf\\i1ioae6pqcsfDsI\\AU7fhnbPCtpaOphXL\\Vxn\\gJFO1o6JAMBmBWP\\8EKwcdps\\JGd\\SgfwKrEd5\\pGSxLp\\DuA8th1\\YRx8u0LF8Cgs6JEfwA\\dIV0Ay\\PEc2\\CSli\\nyRaOzgBtLuM8S09st\\vMd9Ctvc8c6\\2\\H5tpHh\\K6TsNhH\\jXmon6\\BqvEDk\\gsMH20FxEgwlY'
file_name = "test_file"
symlink_name = "C:\\Temp\\long_link"
os.makedirs(long_path)
with open(os.path.join(long_path, file_name), "w") as file:
file.write("I'm some test data in a long path!")
win32file.CreateSymbolicLink(symlink_name, long_path, 0x3)
subprocess.call("type %s" % file_name, shell=True, timeout=None, cwd=symlink_name)
I'm some test data in a long path!0
就像@eryksun在评论中提到的那样:创建符号链接需要SeCreateSymbolicLinkPrivilege,默认情况下,它仅分配给高级管理员。 (但是,可以将其显式分配给用户和组。)如果os.symlink引发OSError,则可以通过_winapi.CreateJunction或CMD的mklink / j命令创建联结。
最后是another answer,如果创建联结,则应启用相同的行为。我尚未结合您的问题测试过此答案,但应该有效。
编辑:如果正在运行> = Python 3.5,则可以使用CreateJunction调用替换上面的符号链接。
import _winapi
_winapi.CreateJunction(source, target)