让我们假设项目的目录结构为
<root>
__init__.py
helloworld.py
<moduleOne>
f.txt
__init__.py
printfile.py
其中root和moduleOne是目录
helloworld.py的内容:
#!/usr/bin/python
import helloworld.printfile
printf()
moduleOne / printfile的内容
#!/usr/bin/python
f = open('f.txt')
def printf():
print 'print file'
print f
if __name__ == '__main__':
printf()
我的问题:
从moduleOne / printfile的执行是好的,但是从root /,如果我运行helloworld.py,会发生以下错误:
import moduleOne.printfile
File "/root/moduleOne/printfile.py", line 5, in <module>
f = open('f.txt')
IOError: [Errno 2] No such file or directory: 'f.txt'
如何在python中解决这个问题?
[被修改]
我使用&#34;解决方法&#34;解决了(或多或少)这个问题,但是stil有问题:
我的解决方案:
在moduleOne / printfile
中import sys
fname = 'moduloOne/f.txt'
def printf():
f = open(fname)
print 'print file'
print f
if __name__ == '__main__':
fname = 'f.txt'
printf()
但是....
假设我有一个新目录,从根目录,等等,然后新结构是:
<root>
__init__.py
helloworld.py
<moduleOne>
f.txt
__init__.py
printfile.py
<etc>
f2.txt
现在我需要从moduleOne / printfile获取etc / f2.txt。如何?
答案 0 :(得分:1)
你需要更多的抽象。
printfile.py
函数中的全局。接受文件句柄作为printf
函数的参数:
printf
在一个 实际上需要知道def printf(file_handle):
print 'print file'
print file_handle
的路径的脚本中(我猜你的f.txt
),把它放在那里,打开它,并将其传递给helloworld.py
:
printf
更好的是,从命令行获取文件路径
from moduleOne.printfile import printf
my_f_file = open('/path/to/f.txt')
printf(my_f_file)
编辑:你在your Google+ cross-post上说:
完整路径是问题,程序将在不同的环境中运行。
如果您尝试将程序分发给其他用户和计算机,则应查看making a distribution package(请参阅下面的注释3),并使用import sys
from moduleOne.printfile import printf
input_file_path = sys.argv[1]
my_f_file = open(input_file_path)
printf(my_f_file)
包含您的配置文件,以及{ {1}}或package_data
访问配置文件。见How do I use data in package_data from source code?
一些旁注:
tree
command pkgutil
而不是pkg_resources
,/
而不是<root>
的约定moduleOne/
重命名为<moduleOne>
。具有moduleOne/
文件的目录构成包。以packageOne/
扩展名结尾的文件是一个模块。模块可以通过物理存在于具有__init__.py
文件的目录中而成为包的一部分。包可以是其他包的一部分,它是父目录的物理子目录,带有.py
文件。