我正在构建一个简单的帮助脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有一个来自脚本的相对路径,但是当我调用脚本时,它将其视为相对于当前工作目录的路径.有没有办法指定这个相对url来自脚本的位置?
这似乎是一个新手问题,但事实并非如此.一些常见的方法并不适用于所有情况:
这意味着使用path = os.path.abspath(os.path.dirname(sys.argv[0])),但如果您从另一个目录中的另一个Python脚本运行,这不起作用,这可能发生在现实生活中.
这意味着使用path = os.path.abspath(os.path.dirname(__file__)),但我发现这不起作用:
py2exe没有__file__属性,但有一个解决方法execute()没有__file__属性NameError: global name '__file__' is not defined回答不完整的相关问题:
我正在寻找一个通用的解决方案,一个适用于所有上述用例的解决方案.
这是测试用例的结果:
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)
#! /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) 我每分钟从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脚本位于同一目录中的文件
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代码在先前的Windows目录中称为"main"而不知道,并且在运行时安装代码的任何地方都需要访问目录"main/2091/data.txt".
我应该如何使用开放(位置)功能?应该是什么位置?
编辑:
我发现下面的简单代码会起作用..它有什么缺点吗?
file="\2091\sample.txt"
path=os.getcwd()+file
fp=open(path,'r+');
Run Code Online (Sandbox Code Playgroud) 我理解起来很困难__file__.据我所知,__file__返回加载模块的绝对路径.
我遇到问题:我有abc.py一个声明print __file__,从/d/projects/ python abc.py返回运行abc.py.从/d/退货运行projects/abc.py.有什么原因吗?
当我在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) 出于某种原因,我的代码无法打开一个简单的文件:
这是代码:
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()的完整路径,似乎没有任何工作.假设你有一个包含的模块
myfile = open('test.txt', 'r')
Run Code Online (Sandbox Code Playgroud)
'test.txt'文件位于同一个文件夹中.如果您将运行该模块,该文件将成功打开.现在假设您从另一个文件夹中导入该模块.不会在与该代码所在的模块相同的文件夹中搜索该文件.那么如何让模块首先在同一个文件夹中搜索相对路径的文件呢?使用" __file__"或" os.getcwd()" 有各种解决方案,但我希望有一种更简洁的方法,就像传递给open()或file()的字符串中的相同特殊字符一样.
假设我有一个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)