在Python

时间:2018-03-22 19:50:41

标签: python relative-path local-variables

我在Python脚本中有一个局部变量,它使用我本地C:\<User> folder中的路径创建临时文件:

 Output_Feature_Class = "C:\\Users\\<User>\\Documents\\ArcGIS\\Default.gdb\\Bnd_"

但是,我希望能够与其他人共享此脚本,并且不希望为使用它的每个人硬编码文件路径。我基本上希望它转到同一个文件夹但<insert their User Name>示例:C:\\TBrown\\Documents\\ArcGIS\Default.gdb\\Bnd_。我似乎无法使用

 Output_Feature_Class = "..\\Documents\\ArcGIS\\Default.gdb\\Bnd_"

上班。有什么我想念的吗?

4 个答案:

答案 0 :(得分:2)

为什么不使用getpass

,而不是要求他们输入用户名

例如获取用户名:

import getpass
a = getpass.getuser()
Output_Feature_Class = "C:\\Users\\" + a + "\\Documents\\ArcGIS\\Default.gdb\\Bnd_"

如果你在Windows上工作(这只适用于Windows),pywin模块可以找到文档的路径:

from win32com.shell import shell, shellcon

a = shell.SHGetFolderPath(0, shellcon.CSIDL_PERSONAL, None, 0)

Output_Feature_Class = "{}\\ArcGIS\\Default.gdb\\Bnd_".format(a)

但这不是跨平台的。感谢此解决方案的martineau,请参阅Finding the user's "My Documents" path查找文档路径。

答案 1 :(得分:2)

与@Simon相同的答案,但是使用字符串格式化来缩小它并且不会尝试将字符串连接在一起:

import getpass

Output_Feature_Class = "C:\\Users\\%s\\Documents\\ArcGIS\\Default.gdb\\Bnd_" % getpass.getuser()

正如@Matteo Italia指出的那样,Nothing不会保证用户个人资料位于c:\users下,或者用户名称调用用户个人资料目录。所以,也许通过获取用户的主目录并从那里建立路径来解决它会更有利:

from os.path import expanduser
Output_Feature_Class = "%s\\Documents\\ArcGIS\\Default.gdb\\Bnd_" % expanduser("~")

更新

正如@Matteo Italia再次指出的那样,可能存在Documents目录默认位于其他位置的情况。这可能有助于找到Documents My Documents文件夹的路径:引用(link

from win32com.shell import shell
df = shell.SHGetDesktopFolder()
pidl = df.ParseDisplayName(0, None, "::{450d8fba-ad25-11d0-98a8-0800361b1103}")[1]

Output_Feature_Class = "%s\\ArcGIS\\Default.gdb\\Bnd_" % shell.SHGetPathFromIDList(pidl)

答案 2 :(得分:0)

为什么不使用Windows%TEMP%环境变量,而不是将临时文件存储在您选择的可能存在或不存在的位置?如果他们没有设置%TEMP%,很多软件都无法工作。

import os

def set_temp_path(*args):
    if os.name is 'nt':
        temp_path = os.getenv('TEMP')
        if not temp_path:
            raise OSError('No %TEMP% variable is set? wow!')
        script_path = os.path.join(temp_path, *args)
        if not os.path.exists(script_path):
            os.makedirs(script_path)
        return script_path
    elif os.name is 'posix':
        #perform similar operation for linux or other operating systems if desired
        return "linuxpath!"
    else:
        raise OSError('%s is not a supported platform, sorry!' % os.name)

您可以将此代码用于此脚本或任何其他脚本的任意临时文件结构:

my_temp_path = set_temp_path('ArcGIS', 'Default.gdb', 'Bnd_')

这将为您创建所有需要的目录,并返回路径以便在脚本中进一步使用。

'C:\\Users\\JSmith\\AppData\\Local\\Temp\\ArcGIS\\Default.gdb\\Bnd_'

如果您打算支持多个平台,这当然是不完整的,但这在Linux上使用全局/tmp或/ var/temp路径应该是直截了当的。

答案 3 :(得分:0)

要获取用户的主目录,您可以使用os.path.expanduser获取用户的主目录。

Output_Feature_Class = os.path.join(os.path.expanduser('~'), "Documents\\ArcGIS\\Default.gdb\\Bnd_")

正如其他人所说,在您这样做之前,请考虑这是否是这些文件的最佳位置。临时文件应位于OS约定为临时文件保留的位置。