我有脚本调用其他脚本文件,但我需要获取当前在该进程中运行的文件的文件路径.
例如,假设我有三个文件.使用execfile:
script_1.py电话script_2.py.script_2.py打电话script_3.py.我怎样才能获得的文件名和路径script_3.py,从内部代码script_3.py,而无需从传递这些信息作为参数script_2.py?
(执行os.getcwd()返回原始起始脚本的文件路径而不是当前文件的.)
我正在构建一个简单的帮助脚本,用于将代码库中的几个模板文件复制到当前目录.但是,我没有存储模板的目录的绝对路径.我确实有一个来自脚本的相对路径,但是当我调用脚本时,它将其视为相对于当前工作目录的路径.有没有办法指定这个相对url来自脚本的位置?
我曾经只是使用像这样的命令打开与当前运行的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]))似乎返回脚本目录.我不确定这两者之间是否有任何区别.
编辑:
我刚刚意识到我想做的事情会更好地描述为"在与包含模块相同的目录中打开一个文件".换句话说,如果我导入了一个我在另一个目录中编写的模块,并且该模块打开了一个文件,我希望它在模块的目录中查找该文件.我认为我发现的任何东西都不能做到这一点......
出于某种原因,我的代码无法打开一个简单的文件:
这是代码:
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()的完整路径,似乎没有任何工作.经过一段谷歌搜索并在这里搜索,找不到这个愚蠢问题的答案!
对于像这样的结构......
dirZero
|---dirOne
|---|---myProgram.exe
Run Code Online (Sandbox Code Playgroud)
如果我当前的目录是dirZero,如何运行"myProgram"?IE浏览器,
C:\dirZero> dirOne/myProgram.exe
Run Code Online (Sandbox Code Playgroud)
......显然不起作用.提前致谢.
假设我有一个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) 什么是shell脚本的当前目录?我这个目前的目录,我打电话给它?或者脚本所在的这个目录?
我有一个名为的脚本requests.py导入请求包.该脚本无法访问包中的属性,也无法导入它们.为什么这不起作用,我该如何解决?
以下代码提出了一个问题AttributeError.
import requests
res = requests.get('http://www.google.ca')
print(res)
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "/Users/me/dev/rough/requests.py", line 1, in <module>
import requests
File "/Users/me/dev/rough/requests.py", line 3, in <module>
requests.get('http://www.google.ca')
AttributeError: module 'requests' has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)
以下代码提出了一个问题ImportError.
from requests import get
res = get('http://www.google.ca')
print(res)
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "requests.py", line 1, in <module>
from requests import get
File "/Users/me/dev/rough/requests.py", line 1, in <module>
from requests import get
ImportError: cannot import name 'get' …Run Code Online (Sandbox Code Playgroud) 我使用os模块在我的Django项目settings.py文件中有相对路径.变量SITE_ROOT设置为文件的当前工作目录,settings.py然后用于引用static/media同一目录中的所有目录.
继承人我的问题:
print os.getcwd()
print os.path.abspath(os.path.dirname(__file__))
Run Code Online (Sandbox Code Playgroud)
在settings.py中,上述语句都具有相同的输出.但我的模板只会在我使用时加载SITE_ROOT = os.path.abspath(os.path.dirname(__file__))
Django在这里寻找模板:
TEMPLATE_DIRS = (
os.path.join(SITE_ROOT, 'templates'),
)
Run Code Online (Sandbox Code Playgroud)
SITE_ROOT设置os.getcwd()似乎让Django的查找模板文件夹的目录上面的settings.py文件
我可以很容易地不使用os.getcwd(),我的网站运行良好,但我很好奇这里可能会发生什么:)
谁知道?