相关疑难解决方法(0)

Python中的相对路径

我正在构建一个简单的帮助脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有一个来自脚本的相对路径,但是当我调用脚本时,它将其视为相对于当前工作目录的路径.有没有办法指定这个相对url来自脚本的位置?

python path relative-path

204
推荐指数
9
解决办法
34万
查看次数

如何在Python中获取当前执行文件的路径?

这似乎是一个新手问题,但事实并非如此.一些常见的方法并不适用于所有情况:

sys.argv中[0]

这意味着使用path = os.path.abspath(os.path.dirname(sys.argv[0])),但如果您从另一个目录中的另一个Python脚本运行,这不起作用,这可能发生在现实生活中.

__文件__

这意味着使用path = os.path.abspath(os.path.dirname(__file__)),但我发现这不起作用:

  • py2exe没有__file__属性,但有一个解决方法
  • 从IDLE运行时execute()没有__file__属性
  • OS X 10.6我得到的地方 NameError: global name '__file__' is not defined

回答不完整的相关问题:

我正在寻找一个通用的解决方案,一个适用于所有上述用例的解决方案.

更新

这是测试用例的结果:

输出python a.py(在Windows上)

a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz

b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz
Run Code Online (Sandbox Code Playgroud)

a.py

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

print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print …
Run Code Online (Sandbox Code Playgroud)

python directory path

183
推荐指数
8
解决办法
12万
查看次数

python:将脚本工作目录更改为脚本自己的目录

我每分钟从crontab运行一个python shell:

* * * * * /home/udi/foo/bar.py
Run Code Online (Sandbox Code Playgroud)

/home/udi/foo有一些必要的子目录,比如/home/udi/foo/log/home/udi/foo/config,/home/udi/foo/bar.py指的是.

问题是crontab从不同的工作目录运行脚本,因此尝试打开./log/bar.log失败.

有没有一种很好的方法告诉脚本将工作目录更改为脚本自己的目录?我想要一个适用于任何脚本位置的解决方案,而不是明确地告诉脚本它在哪里.

编辑:

os.chdir(os.path.dirname(sys.argv[0]))
Run Code Online (Sandbox Code Playgroud)

是最紧凑的优雅解决方案.感谢您的回答和解释!

python working-directory

153
推荐指数
4
解决办法
15万
查看次数

如何在与Python脚本相同的目录中可靠地打开文件

我曾经只是使用像这样的命令打开与当前运行的Python脚本位于同一目录中的文件

open("Some file.txt", "r")
Run Code Online (Sandbox Code Playgroud)

但是,我发现当脚本在Windows中通过双击运行时,它会尝试从错误的目录中打开该文件.

从那以后我使用了表格的命令

open(os.path.join(sys.path[0], "Some file.txt"), "r")
Run Code Online (Sandbox Code Playgroud)

每当我想打开一个文件.这适用于我的特定用法,但我不确定是否sys.path[0]可能在其他一些用例中失败.

所以我的问题是:打开与当前运行的Python脚本位于同一目录中的文件的最佳和最可靠的方法是什么?

这是我到目前为止能够弄清楚的:

  • os.getcwd()os.path.abspath('')返回"当前工作目录",而不是脚本目录.

  • os.path.dirname(sys.argv[0])os.path.dirname(__file__)返回用于调用脚本的路径,该路径可能是相对的,甚至是空白的(如果脚本在cwd中).此外,__file__当脚本在IDLE或PythonWin中运行时不存在.

  • sys.path[0]并且os.path.abspath(os.path.dirname(sys.argv[0]))似乎返回脚本目录.我不确定这两者之间是否有任何区别.

编辑:

我刚刚意识到我想做的事情会更好地描述为"在与包含模块相同的目录中打开一个文件".换句话说,如果我导入了一个我在另一个目录中编写的模块,并且该模块打开了一个文件,我希望它在模块的目录中查找该文件.我认为我发现的任何东西都不能做到这一点......

python directory

138
推荐指数
4
解决办法
12万
查看次数

在Python中的相对位置打开文件

假设python代码在先前的Windows目录中称为"main"而不知道,并且在运行时安装代码的任何地方都需要访问目录"main/2091/data.txt".

我应该如何使用开放(位置)功能?应该是什么位置?

编辑:

我发现下面的简单代码会起作用..它有什么缺点吗?

    file="\2091\sample.txt"
    path=os.getcwd()+file
    fp=open(path,'r+');
Run Code Online (Sandbox Code Playgroud)

python file path relative-path

112
推荐指数
7
解决办法
38万
查看次数

模块__file__属性是绝对的还是相对的?

我理解起来很困难__file__.据我所知,__file__返回加载模块的绝对路径.

我遇到问题:我有abc.py一个声明print __file__,从/d/projects/ python abc.py返回运行abc.py.从/d/退货运行projects/abc.py.有什么原因吗?

python

100
推荐指数
5
解决办法
11万
查看次数

python NameError:未定义全局名称"__file__"

当我在python 2.7中运行此代码时,我收到此错误:

Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 30, in <module>
    long_description = read('README.txt'),
  File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 19, in read
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
NameError: global name '__file__' is not defined
Run Code Online (Sandbox Code Playgroud)

代码是:

import os
from setuptools import setup


def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()


setup(name="pyutilib.subprocess",
    version='3.5.4',
    maintainer='William E. Hart',
    maintainer_email='wehart@sandia.gov',
    url = 'https://software.sandia.gov/svn/public/pyutilib/pyutilib.subprocess',
    license = 'BSD',
    platforms = ["any"],
    description = 'PyUtilib utilites for managing subprocesses.',
    long_description = read('README.txt'),
    classifiers = [
        'Development Status :: 4 - Beta',
        'Intended Audience …
Run Code Online (Sandbox Code Playgroud)

python nameerror

95
推荐指数
9
解决办法
14万
查看次数

Python open()给出IOError:Errno 2没有这样的文件或目录

出于某种原因,我的代码无法打开一个简单的文件:

这是代码:

file1 = open('recentlyUpdated.yaml')
Run Code Online (Sandbox Code Playgroud)

错误是:

IOError: [Errno 2] No such file or directory: 'recentlyUpdated.yaml'
Run Code Online (Sandbox Code Playgroud)
  • 当然,我检查了这是文件的正确名称.
  • 我试过移动文件,给出文件open()的完整路径,似乎没有任何工作.

python file-io file filenotfoundexception file-not-found

56
推荐指数
3
解决办法
30万
查看次数

制作"始终相对于当前模块"的文件路径?

假设你有一个包含的模块

myfile = open('test.txt', 'r')
Run Code Online (Sandbox Code Playgroud)

'test.txt'文件位于同一个文件夹中.如果您将运行该模块,该文件将成功打开.现在假设您从另一个文件夹中导入该模块.不会在与该代码所在的模块相同的文件夹中搜索该文件.那么如何让模块首先在同一个文件夹中搜索相对路径的文件呢?使用" __file__"或" os.getcwd()" 有各种解决方案,但我希望有一种更简洁的方法,就像传递给open()或file()的字符串中的相同特殊字符一样.

python module relative-path

49
推荐指数
2
解决办法
1万
查看次数

在python项目中使用相对路径读取文件

假设我有一个python项目,结构如下:

project
    /data
        test.csv
    /package
        __init__.py
        module.py
    main.py
Run Code Online (Sandbox Code Playgroud)

__init__.py:

from .module import test
Run Code Online (Sandbox Code Playgroud)

module.py:

import csv

with open("..data/test.csv") as f:
    test = [line for line in csv.reader(f)]
Run Code Online (Sandbox Code Playgroud)

main.py:

import package

print(package.test)
Run Code Online (Sandbox Code Playgroud)

当我运行时,main.py我收到以下错误:

 C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
  File "main.py", line 1, in <module>
    import package
  File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module>
    from .module import test
  File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
    with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: …
Run Code Online (Sandbox Code Playgroud)

python io relative-path python-import python-3.x

45
推荐指数
3
解决办法
7万
查看次数